茉莉花JavaScripttesting – toBe vs toEqual

假设我有以下几点:

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

上述两个testing都会通过。 在评估数字时, toBe()toEqual()之间有区别吗? 如果是这样,我应该使用一个而不是另一个?

对于原始types(例如数字,布尔值,string等), 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 

茉莉花的匹配只不过是一个严格的平等比较的包装

 expect(a.foo).toBe(b.foo) 

是一样的事情

 expect(a.foo === b.foo).toBe(true) 

不要只听我的话, 请参阅toBe的源代码 。

但是bc代表function上相同的对象; 他们都看起来像

 { foo: { bar: 'baz' } } 

如果我们可以说bc即使不代表同一个对象也是“平等的”,那不是很好吗?

inputtoEqual ,它检查“深度相等”(即通过对象进行recursionsearch以确定它们的键值是否相等)。 以下两个testing都会通过:

 expect(b).not.toBe(c); expect(b).toEqual(c); 

希望有助于澄清一些事情。

toBe()toEqual()toEqual()检查等价性。 toBe() ,另一方面,确保它们是完全相同的对象。

比较值时我会说使用toBe() ,比较对象时使用toBe()

比较原始types时, toEqual()toBe()会得到相同的结果。 比较对象时, toBe()是一个比较严格的比较,如果它不是在内存中完全相同的对象,这将返回false。 所以,除非你想确定它是在内存中的完全相同的对象,使用toEqual()比较对象。

检查此链接了解更多信息: http : //evanhahn.com/how-do-i-jasmine/

现在,当谈到数字时,要注意toBe()toEqual()之间的区别,只要您的比较是正确的,就不应该有任何区别。 5总是等于5

这是一个很好的地方,可以看到不同的结果

更新

查看toBe()toEqual()一个简单方法是了解它们在JavaScript中究竟做了什么。 根据Jasmine API,在这里find:

toEqual()适用于简单的文字和variables,并且应该用于对象

toBe()与===进行比较

从本质上说, toEqual()toBe()是类似的Javascript ===运算符,除了toBe()也检查以确保它是完全相同的对象,在下面的例子objectOne === objectTwo //returns false 。 但是, toEqual()将在这种情况下返回true。

现在,你至less可以理解为什么当给出:

 var objectOne = { propertyOne: str, propertyTwo: num } var objectTwo = { propertyOne: str, propertyTwo: num } 

expect(objectOne).toBe(objectTwo); //returns false

这是因为,正如在这个答案中提到的另一个类似的问题一样, ===操作符实际上意味着两个操作数引用相同的对象,或者在值types的情况下具有相同的值。

引用茉莉花github项目,

expect(x).toEqual(y); 比较对象或基元x和y,如果它们相等则通过

expect(x).toBe(y); 比较对象或基元x和y, 如果它们是相同的对象则通过

看着茉莉花源代码揭示了这个问题。

toBe非常简单,只需使用identity / strict平等运算符===

  function(actual, expected) { return { pass: actual === expected }; } 

另一方面, toEqual接近150行,对StringNumberBooleanDateErrorElementRegExp等内置对象进行了特殊处理。 对于其他对象recursion地比较属性。

这与等号运算符==的行为非常不同。 例如:

 var simpleObject = {foo: 'bar'}; expect(simpleObject).toEqual({foo: 'bar'}); //true simpleObject == {foo: 'bar'}; //false var castableObject = {toString: function(){return 'bar'}}; expect(castableObject).toEqual('bar'); //false castableObject == 'bar'; //true