【问题标题】:Chai test array of objects to "contain something like" an object submatchChai 测试对象数组以“包含类似”对象子匹配
【发布时间】:2017-11-19 14:37:44
【问题描述】:

好的。我试图在这里阅读其他问题,但仍然没有找到一个直截了当的答案。

如何使用 chai 在数组中断言部分对象匹配? 类似于以下内容:

var expect = require('chai').expect;
var data = [ { name: 'test', value: 'bananas' } ];
expect(data).to.be.an('array').that.contains.somethig.like({name: 'test'});

澄清一下,我的目的是尽可能接近所提供的示例。

  • 链接到.be.an('array')
  • 仅提供部分对象作为参数(与chai-subset 不同)。

我真的认为expect(data).to.be.an('array').that.deep.contains({name: 'test'}); 会起作用,但它因为不是部分匹配而失败,我有点搞砸了。

【问题讨论】:

    标签: javascript chai


    【解决方案1】:

    由于chai-like@0.2.14,以下方法将起作用:

    var chai = require('chai'),
        expect = chai.expect;
    
    chai.use(require('chai-like'));
    chai.use(require('chai-things')); // Don't swap these two
    
    expect(data).to.be.an('array').that.contains.something.like({name: 'test'});
    

    【讨论】:

    • use chai 插件的顺序确实很重要;让他们以正确的方式解决我的问题。
    【解决方案2】:

    ES6+

    干净、实用且无依赖,只需使用地图过滤您要检查的键

    类似:

    const data = [ { name: 'test', value: 'bananas' } ];
    expect(data.map(e=>e.name)).to.include("test");
    

    如果你想测试多个键:

    expect(data.map(e=>({name:e.name}))).to.include({name:"test"});
    

    https://www.chaijs.com/api/bdd/

    【讨论】:

    • 干净整洁。虽然它仅适用于单个属性(在这种情况下为name)。对于两个或更多,您必须为每个重复您的单线。 chai-like 比较传递对象的所有属性,同时忽略输入数据的其余部分。
    【解决方案3】:

    不知道为什么你解雇了chai-subset,因为这似乎有效:

    expect(data).to.be.an("array").to.containSubset([{ name: "test" }]);
    

    【讨论】:

    • 好吧,我必须承认我根本不喜欢containSubset 命名和额外的括号。我希望找到一个纯粹使用chai 没有插件的解决方案,但我想情况并非如此。我试图深入了解.contains.something.like({...}) 版本(同时使用chai-thingschai-like),我喜欢它听起来如此自然,而且我首先找到了whywasn't working。我知道.. 两个插件而不是一个,但我更喜欢措辞和更简单的参数。
    【解决方案4】:

    没有第三方库或插件的解决方案:

    var data = [ { name: 'test', value: 'bananas' } ];
    expect(data.map(({name}) => ({name})).to.deep.include({name: 'test'});
    

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 2023-04-02
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多