茉莉花JavaScripttesting – toBe vs toEqual
假设我有以下几点:
var myNumber = 5; expect(myNumber).toBe(5); expect(myNumber).toEqual(5);
上述两个testing都会通过。 在评估数字时, toBe()
和toEqual()
之间有区别吗? 如果是这样,我应该使用一个而不是另一个?
对于原始types(例如数字,布尔值,string等), 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
茉莉花的匹配只不过是一个严格的平等比较的包装
expect(a.foo).toBe(b.foo)
是一样的事情
expect(a.foo === b.foo).toBe(true)
不要只听我的话, 请参阅toBe的源代码 。
但是b
和c
代表function上相同的对象; 他们都看起来像
{ foo: { bar: 'baz' } }
如果我们可以说b
和c
即使不代表同一个对象也是“平等的”,那不是很好吗?
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行,对String
, Number
, Boolean
, Date
, Error
, Element
和RegExp
等内置对象进行了特殊处理。 对于其他对象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
- QUnit vs茉莉花?
- 量angular器:如何在点击一个button后等待页面完成?
- 获取requirejs与茉莉花一起工作
- 如何用Jasmine为私有方法编写Angular 2 / TypeScript的unit testing
- 为什么我的AngularJS,Karma / Jasminetesting运行得如此缓慢?
- Jasmine用templateUrltestingAngularJS指令
- 如何编写一个期望在Jasmine中抛出Error的testing?
- 用Jasmine的toHaveBeenCalledWith方法使用对象types
- 为什么$只在'angular.mock.module'函数中可用,$ q只在'angular.mock.inject'函数中可用?