假设我有以下几点:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
上述两项测试都将通过。在计算数字时,toBe()
和toEqual()
之间有什么区别吗?如果是的话,我什么时候应该使用其中一种而不是另一种?
发布于 2015-01-13 18:59:31
对于原语类型(例如数字、布尔值、字符串等),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)
不要只相信我的话,请看toBe的源代码。
但是b
和c
表示功能上等价的对象;它们看起来都像
{ foo: { bar: 'baz' } }
如果我们可以说b
和c
是“平等的”,即使它们不代表相同的对象,这不是很好吗?
输入toEqual
,它检查“深度相等”(即对对象进行递归搜索,以确定其键的值是否等效)。以下两项测试都将通过:
expect(b).not.toBe(c);
expect(b).toEqual(c);
希望这有助于澄清一些事情。
发布于 2014-03-14 18:39:15
toBe()
与toEqual()
:toEqual()
检查等价性。另一方面,toBe()
确保它们是完全相同的对象。
我认为在比较值时使用toBe()
,在比较对象时使用toEqual()
。
当比较基本类型时,toEqual()
和toBe()
将产生相同的结果。当比较对象时,toBe()
是一个更严格的比较,如果它不是内存中的完全相同的对象,这将返回false。因此,除非您想确保内存中的对象是完全相同的,否则使用toEqual()
来比较对象。
查看此链接以获得更多信息:http://evanhahn.com/how-do-i-jasmine/
现在,当考虑到toBe()
和toEqual()
在数字方面的差异时,只要您的比较是正确的,就不应该有任何差别。5
将永远等同于5
。
为了看到不同的结果,一个很好的地方是这里。
更新
查看toBe()
和toEqual()
的一个简单方法是了解它们在JavaScript中到底做了什么。根据茉莉花API,发现了这里
toEqual()适用于简单的文字和变量,并且应该适用于对象 toBe()与
===
比较
本质上,这意味着toEqual()
和toBe()
是类似的Javascripts ===
操作符,但toBe()
也在检查,以确保它是完全相同的对象,在objectOne === objectTwo //returns false
下面的示例中也是如此。但是,在这种情况下,toEqual()
将返回true。
现在,您至少可以理解为什么:
var objectOne = {
propertyOne: str,
propertyTwo: num
}
var objectTwo = {
propertyOne: str,
propertyTwo: num
}
expect(objectOne).toBe(objectTwo); //returns false
这是因为,正如这是一个不同但相似的问题的答案,中所述,===
运算符实际上意味着两个操作数引用相同的对象,或者在值类型的情况下,具有相同的值。
发布于 2014-08-05 03:37:37
引用茉莉花github项目,
expect(x).toEqual(y);
比较对象或原语x和y,如果它们是等价的,则传递它们。expect(x).toBe(y);
比较对象或原语x和y,如果它们是相同的对象,则传递。
https://stackoverflow.com/questions/22413009
复制相似问题