6

当两者都是对象数组时,断言预期结果与实际结果匹配的最佳方法是什么?我的直接想法是使用 Array 原型过滤器并检查交集是否与预期的大小相同,即:

describe('select',function(){
  it("should return selected columns", function(done) {
    var query = "select lunchTime, name";

    var actual = ... results of the query, an array of anonymous objects ...

    // expected results
    var expected = [{"lunchTime": "12:00:00", "name": "John"}, 
                   {"lunchTime": "12:00:00", "name": "Dave"}, 
                   {"lunchTime": "13:00:00", "name": "Sally"}, 
                   {"lunchTime": "12:00:00", "name": "Ben"}, 
                   {"lunchTime": "12:00:00", "name": "Dana"}, 
                   {"lunchTime": "13:00:00", "name": "Mike"}];

    var intersection = actual.filter(function(n) {
        return expected.indexOf(n) != -1
    });

    expect(intersection).to.have.length(expected.length);
    expect(actual).to.have.length(expected.length);
  });
});

这种方法有意义吗?有没有更好的方法来断言查询结果符合预期?

4

2 回答 2

14

如您所述,对于集合,您可以使用:

expect(actual).to.have.members(expected);

如果其中的任何成员expected不在 中actual,这将失败,反之亦然。

你也可以这样做:

expect(actual).to.contain.members(expected);

expected如果其中有成员不在其中,这将失败,但如果其中有成员不在,actual不会失败。(换句话说,必须是 的超集)。actualexpectedactualexpected

如果您正在比较对象,您可能想要深入比较:

expect(actual).to.deep.have.same.members(expected);

例如:

expect([{a:'a'}, {a:'b'}]).to.deep.have.same.members([{a:'a'}, {a:'b'}]);

(编辑:to.have.same.members()实际上是一样的to.have.members()。)

于 2015-05-15T15:42:22.130 回答
7

Chai 有一个成员匹配器,可以满足我的需要:

expect(actual).to.have.members(expected);
于 2014-01-01T03:13:58.327 回答