【问题标题】:Mocha Chai: Deep include an array of objects, but only have part of expected objectMocha Chai:深度包含对象数组,但只有部分预期对象
【发布时间】:2020-06-24 03:54:24
【问题描述】:

我为此使用 chai 的 assert 语法。

我知道如果我想检查一个对象数组中的某个特定对象,我可以这样做:

assert.deepInclude(
  [
    { name: 'foo', id: 1 },
    { name: 'bar', id: 2 }
  ], 
  { name: 'foo', id: 1 }
)

应该通过。

但是,如果我正在检查的对象中只有 1 个属性...?像这样:

assert.deepInclude(
  [
    { name: 'foo', id: 1 },
    { name: 'bar', id: 2 }
  ], 
  { name: 'foo' }
)

我仍然希望它通过,但它告诉我它失败了,因为那个确切的对象不存在。

【问题讨论】:

    标签: javascript node.js mocha.js chai


    【解决方案1】:

    使用chai-subset 可以很容易地做到这一点:

    const chai = require('chai');
    const chaiSubset = require('chai-subset');
    chai.use(chaiSubset);
    
    it('should contain subset', () => {
        const actual = [
          { name: 'foo', id: 1 },
          { name: 'bar', id: 2 },
        ];
    
        expect(actual).to.containSubset([{ name: 'foo' }]);
    });
    

    Afaik 无法单独使用 chai 执行此操作,但您可以编写自己的函数:

    function containsPartialObj(arr, obj) {
      return arr.some(entry => {
        const keys = Object.keys(obj);
        return keys.every(key => obj[key] === entry[key]);
      });
    }
    
    it('should contain subset', () => {
         const actual = [
            { name: 'foo', id: 1 },
            { name: 'bar', id: 2 },
         ];
        
         expect(containsPartialObj(actual, { name: 'foo' })).to.be.true;
    });
    

    【讨论】:

    • 谢谢!但是使用原生的assert 库真的没有办法做到这一点吗?
    • Afaik 很遗憾没有 - 我已经编辑了我的答案并添加了一个版本,而无需依赖额外的库。也许它有帮助:)
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2014-05-14
    • 2015-03-11
    • 2018-08-09
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多