【发布时间】:2016-05-04 10:01:21
【问题描述】:
我使用 Jasmine karma 测试用例有一段时间了,发现测试有时会因为使用 .toBe() 而不是 .toEqual() 而失败。 .toBe() 和 .toEqual() 有什么区别以及何时使用它们?
【问题讨论】:
标签: angularjs jasmine karma-jasmine
我使用 Jasmine karma 测试用例有一段时间了,发现测试有时会因为使用 .toBe() 而不是 .toEqual() 而失败。 .toBe() 和 .toEqual() 有什么区别以及何时使用它们?
【问题讨论】:
标签: angularjs jasmine karma-jasmine
toBe() 比较是严格的(例如:obj1 === obj2)
如果比较两个对象,则考虑对象的身份。
而toEqual() 只考虑条目的值(它比较对象,如下划线的isEqual 方法)。
【讨论】:
toEqual 不做== 检查。 toEqual 与下划线 isEqual 方法比较相似,它首先检查 a 和 b 之间的不对称匹配,它还允许您提供自己的自定义匹配函数数组以及检查值之间的不等式。 github.com/jasmine/jasmine/blob/master/src/core/matchers/… 查看toEqual 使用的eq 函数。这允许对象值匹配、数组值匹配等。
这里有一个例子来解释它们之间的区别
describe("Included matchers:", function() {
it("The 'toBe' matcher compares with ===", function() {
var a = 12;
var b = a;
expect(a).toBe(b);
expect(a).not.toBe(null);
});
describe("The 'toEqual' matcher", function() {
it("works for simple literals and variables", function() {
var a = 12;
expect(a).toEqual(12);
});
it("should work for objects", function() {
var foo = {
a: 12,
b: 34
};
var bar = {
a: 12,
b: 34
};
expect(foo).toEqual(bar);
});
});
});
您可以在官方website找到更多关于其他Matcher的详细信息
【讨论】:
根据我的经验,toBe 用于比较字符串、布尔值,例如:
expect(enabled).toBe(true)
expect(user.name).toBe('Bob')
toEqual 更适合比较数组或对象。例如:
expect(myArray).toEqual([1,2,3])
【讨论】: