Chai 测试对象数组到 "contain something like" 一个对象子匹配

Chai test array of objects to "contain something like" an object submatch

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

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

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

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

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

不确定您为什么拒绝 chai-subset,因为这似乎有效:

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

由于 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'});

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/

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

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