Llo*_*nks 319 javascript jasmine
假设我有以下内容:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
Run Code Online (Sandbox Code Playgroud)
上述两项测试都将通过.有没有之间的差异toBe()
,并toEqual()
当它涉及到评估的数字?如果是这样,我应该使用一个而不是另一个?
小智 453
对于原始类型(例如数字,布尔值,字符串等),toBe
和之间没有区别toEqual
; 任何一个可以为工作5
,true
或"the cake is a lie"
.
要理解之间的区别toBe
和toEqual
,假设三个对象.
var a = { bar: 'baz' },
b = { foo: a },
c = { foo: a };
Run Code Online (Sandbox Code Playgroud)
使用严格的比较(===
),有些东西是"相同的":
> b.foo.bar === c.foo.bar
true
> b.foo.bar === a.bar
true
> c.foo === b.foo
true
Run Code Online (Sandbox Code Playgroud)
但有些东西,即使它们"相等",也不是"相同的",因为它们代表了生活在记忆中不同位置的物体.
> b === c
false
Run Code Online (Sandbox Code Playgroud)
Jasmine的toBe
匹配器只不过是一个严格的平等比较的包装器
expect(c.foo).toBe(b.foo)
Run Code Online (Sandbox Code Playgroud)
是一样的
expect(c.foo === b.foo).toBe(true)
Run Code Online (Sandbox Code Playgroud)
不要只听我的话; 看到toBe的源代码.
但是,b
和c
代表功能等价物; 他们俩看起来都像
{ foo: { bar: 'baz' } }
Run Code Online (Sandbox Code Playgroud)
如果我们可以说b
并且c
"平等"即使它们不代表同一个对象,也不是很好吗?
Enter toEqual
,检查"深度相等"(即通过对象进行递归搜索以确定其键的值是否相等).以下两个测试都将通过:
expect(b).not.toBe(c);
expect(b).toEqual(c);
Run Code Online (Sandbox Code Playgroud)
希望有助于澄清一些事情.
Adj*_*jit 77
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中做什么.根据Jasmine 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
}
Run Code Online (Sandbox Code Playgroud)
expect(objectOne).toBe(objectTwo); //returns false
这是因为,在说明这个答案不同,但类似的问题,在===
运营商实际上意味着两个操作数引用同一个对象,或在值类型的情况下,具有相同的值.
Tha*_*aka 30
引用jasmine github项目,
expect(x).toEqual(y);
比较对象或基元x和y,如果它们是等价的则传递
expect(x).toBe(y);
比较对象或基元x和y,如果它们是同一个对象则传递
Tam*_*lyn 14
查看Jasmine源代码可以更清楚地了解这个问题.
toBe
非常简单,只使用identity/strict相等运算符===
:
function(actual, expected) {
return {
pass: actual === expected
};
}
Run Code Online (Sandbox Code Playgroud)
toEqual
,在另一方面,是近150线长,具有内置状物体特殊处理String
,Number
,Boolean
,Date
,Error
,Element
和RegExp
.对于其他对象,它递归地比较属性.
这与等于运算符的行为非常不同==
.例如:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
120857 次 |
最近记录: |