假设我有以下几点:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
以上两个测试都将通过。在评估数字时,
toBe()
和toEqual()
之间有区别吗?如果是这样,我什么时候应该使用而不是另一个? 最佳答案
对于基本类型(例如数字, bool 值,字符串等),toBe
和toEqual
之间没有区别;任一个将适用于5
,true
或"the cake is a lie"
。
为了理解toBe
和toEqual
之间的区别,让我们想象三个对象。
var a = { bar: 'baz' },
b = { foo: a },
c = { foo: a };
使用严格的比较(===
),有些事情是“相同的”:> b.foo.bar === c.foo.bar
true
> b.foo.bar === a.bar
true
> c.foo === b.foo
true
但是有些东西,即使它们是“相等的”,也不是“相同的”,因为它们代表了生活在内存中不同位置的对象。> b === c
false
Jasmine的toBe
匹配器只不过是用于严格相等比较的包装器expect(c.foo).toBe(b.foo)
和...一样expect(c.foo === b.foo).toBe(true)
不要仅仅相信我的话;参见the source code for toBe。但是
b
和c
代表功能上等效的对象;他们俩看起来像{ foo: { bar: 'baz' } }
如果我们可以说b
和c
即使不代表相同的对象也是“相等的”,那不是很好吗?输入
toEqual
,它检查“深度相等性”(即在对象中进行递归搜索以确定其键的值是否相等)。以下两个测试都将通过:expect(b).not.toBe(c);
expect(b).toEqual(c);
希望这有助于澄清一些事情。