【问题标题】:Chai check structure and values of return value柴检查结构和返回值的值
【发布时间】:2021-05-11 09:27:44
【问题描述】:

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

{
  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',
    }
  ]
}

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

有没有办法可以做到这一点?基本保证JSON的结构正确,同时对部分值进行检查。

【问题讨论】:

    标签: javascript json unit-testing testing chai


    【解决方案1】:

    你可以使用Chai JSON Pattern插件来匹配JSON的结构。 API 文档是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"
              }
            ]
          }
        `);
      });
    });
    

    【讨论】:

    • 谢谢。虽然它很奇怪,但它作为字符串处理
    • @user2741831 如果知道uuid的版本,可以用github.com/damian-szulc/chai-json-pattern/blob/master/…代替String
    • 我的意思是它很奇怪整个 json 模式对象被处理为一个字符串。但我认为它会工作得很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多