假设我有以下几点:

var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);

以上两个测试都将通过。在评估数字时,toBe()toEqual()之间有区别吗?如果是这样,我什么时候应该使用而不是另一个?

最佳答案

对于基本类型(例如数字, bool 值,字符串等),toBetoEqual之间没有区别;任一个将适用于5true"the cake is a lie"
为了理解toBetoEqual之间的区别,让我们想象三个对象。

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
但是bc代表功能上等效的对象;他们俩看起来像
{ foo: { bar: 'baz' } }
如果我们可以说bc即使不代表相同的对象也是“相等的”,那不是很好吗?
输入toEqual,它检查“深度相等性”(即在对象中进行递归搜索以确定其键的值是否相等)。以下两个测试都将通过:
expect(b).not.toBe(c);
expect(b).toEqual(c);
希望这有助于澄清一些事情。

07-24 09:50