Chai 检查 return 值的结构和值

Chai check structure and values of return value

我有几个函数想用 chai 进行单元测试,它们是在函数实现之前编写的,因此它们也可以作为设计指南。
因此,我想确保这些函数的 return 值始终遵循一个确切的模式,例如这个:

{
  id: #some unkown UID,
  seller: 'user1',
  seller_offer: [
    {
      inventory: #some inventory uuid,
      item: 'red_card',
      amount: '11',
    }
  ],
  recipient: 'user2',
  recipient_offer: [
    {
      inventory: #some inventory UUID,
      item: 'coin',
      amount: '1234',
    }
  ]
}

return 值不应该有任何额外的键并包含所有必需的键。 如果事先知道所有 return 值,那么使用深度相等很容易。现在的问题是其中一些值是 UUIDS,在 运行 函数之前显然不知道。像这样的功能还有很多
我希望能够简单地将 inventory 和 id 值设置为 null,以便 chai 确保密钥存在,但实际上并不比较它的值(或者甚至可能是检查值是否实际上是 UUIDS 的通配符对象) .

有什么办法可以做到这一点吗?基本确保JSON的结构是正确的,并模拟检查一些值。

您可以使用Chai JSON Pattern plugin to match the structure of the JSON. The API documentation is here

例如

const chai = require('chai');
const chaiJsonPattern = require('chai-json-pattern').default;
const faker = require('faker');

chai.use(chaiJsonPattern);
const { expect } = chai;

describe('67484029', () => {
  it('should pass', () => {
    const obj = {
      id: faker.random.uuid(),
      seller: 'user1',
      seller_offer: [
        {
          inventory: faker.random.uuid(),
          item: 'red_card',
          amount: '11',
        },
      ],
      recipient: 'user2',
      recipient_offer: [
        {
          inventory: faker.random.uuid(),
          item: 'coin',
          amount: '1234',
        },
      ],
    };

    expect(obj).to.matchPattern(`
      {
        "id": String,
        "seller": "user1",
        "seller_offer": [
          {
            "inventory": String,
            "item": "red_card",
            "amount": "11"
          }
        ],
        "recipient": "user2",
        "recipient_offer": [
          {
            "inventory": String,
            "item": "coin",
            "amount": "1234"
          }
        ]
      }
    `);
  });
});