假设我有以下内容:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
以上两个测试都会通过。有没有之间的差异toBe()
,并toEqual()
当它涉及到评估的数字?如果是这样,我什么时候应该使用一个而不是另一个?
假设我有以下内容:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
以上两个测试都会通过。有没有之间的差异toBe()
,并toEqual()
当它涉及到评估的数字?如果是这样,我什么时候应该使用一个而不是另一个?
对于原始类型(例如数字、布尔值、字符串等),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
即使它们不代表同一个对象也“相等” ,那不是很好吗?
Enter toEqual
,它检查“深度相等”(即通过对象进行递归搜索以确定它们的键的值是否相等)。以下两项测试都将通过:
expect(b).not.toBe(c);
expect(b).toEqual(c);
希望这有助于澄清一些事情。
toBe()
vs 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
}
expect(objectOne).toBe(objectTwo); //returns false
这是因为,在说明这个答案不同,但类似的问题,在===
运营商实际上意味着两个操作数引用同一个对象,或在值类型的情况下,具有相同的值。
引用jasmine github项目,
expect(x).toEqual(y);
比较对象或基元 x 和 y,如果它们相等则通过
expect(x).toBe(y);
比较对象或基元 x 和 y, 如果它们是同一个对象,则通过
查看 Jasmine 源代码可以更清楚地了解这个问题。
toBe
非常简单,只使用恒等/严格相等运算符,===
:
function(actual, expected) {
return {
pass: actual === expected
};
}
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
toEqual()
如果是原始值则比较值,如果是对象则比较内容。
toBe()
比较参考。
以下代码/套件应该是不言自明的:
describe('Understanding toBe vs toEqual', () => {
let obj1, obj2, obj3;
beforeEach(() => {
obj1 = {
a: 1,
b: 'some string',
c: true
};
obj2 = {
a: 1,
b: 'some string',
c: true
};
obj3 = obj1;
});
afterEach(() => {
obj1 = null;
obj2 = null;
obj3 = null;
});
it('Obj1 === Obj2', () => {
expect(obj1).toEqual(obj2);
});
it('Obj1 === Obj3', () => {
expect(obj1).toEqual(obj3);
});
it('Obj1 !=> Obj2', () => {
expect(obj1).not.toBe(obj2);
});
it('Obj1 ==> Obj3', () => {
expect(obj1).toBe(obj3);
});
});