Jasmine内置了匹配器toBe
和toEqual
。如果我有这样的对象:
function Money(amount, currency){
this.amount = amount;
this.currency = currency;
this.sum = function (money){
return new Money(200, "USD");
}
}
并尝试比较new Money(200, "USD")
和sum的结果,这些内置匹配器将无法按预期工作。我已经设法实现了基于自定义equals
method和自定义匹配器的解决方案,但它似乎很有效。
在Jasmine中比较对象的标准方法是什么?
答案 0 :(得分:155)
我一直在寻找相同的东西,并找到了一种现有的方法,没有任何自定义代码或匹配器。使用toEqual()
。
答案 1 :(得分:50)
如果您要比较部分对象,可以考虑:
describe("jasmine.objectContaining", function() {
var foo;
beforeEach(function() {
foo = {
a: 1,
b: 2,
bar: "baz"
};
});
it("matches objects with the expect key/value pairs", function() {
expect(foo).toEqual(jasmine.objectContaining({
bar: "baz"
}));
});
});
答案 2 :(得分:3)
它是预期的行为,因为JavaScript中的两个对象实例不一样。
function Money(amount, currency){
this.amount = amount;
this.currency = currency;
this.sum = function (money){
return new Money(200, "USD");
}
}
var a = new Money(200, "USD")
var b = a.sum();
console.log(a == b) //false
console.log(a === b) //false
要进行干净的测试,您应该编写自己的匹配器,比较amount
和currency
:
beforeEach(function() {
this.addMatchers({
sameAmountOfMoney: function(expected) {
return this.actual.currency == expected.currency && this.actual.amount == expected.amount;
}
});
});
答案 3 :(得分:2)
我发现lodash _.isEqual对此很有帮助
expect(_.isEqual(result, expectedResult)).toBeTruthy()
答案 4 :(得分:0)
我设法在没有任何自定义代码的情况下比较了两个对象:
import { deepStrictEqual } from 'assert'
// ...
expect(deepStrictEqual.bind(null, objectA, objectB)).not.toThrow()
注意:assert
是原生节点模块,这里不需要安装任何东西
答案 5 :(得分:-2)
你的问题是真实的。您正在尝试比较对象的两个不同实例,这对于正则相等(a == b)是真实的,但对于严格相等则不是真(a === b)。茉莉花使用的比较物是 寻找严格平等的jasmine.Env.equals_()。
要在不更改代码的情况下完成所需的操作,您可以通过使用类似以下内容检查真实性来使用常规相等:
expect(money1.sum() == money2.sum()).toBeTruthy();