首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >茉莉花JavaScript测试- toBe vs toEqual

茉莉花JavaScript测试- toBe vs toEqual
EN

Stack Overflow用户
提问于 2014-03-14 18:29:23
回答 7查看 189.6K关注 0票数 423

假设我有以下几点:

代码语言:javascript
运行
复制
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);

上述两项测试都将通过。在计算数字时,toBe()toEqual()之间有什么区别吗?如果是的话,我什么时候应该使用其中一种而不是另一种?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-01-13 18:59:31

对于原语类型(例如数字、布尔值、字符串等),toBetoEqual之间没有区别;这两种类型都适用于5true"the cake is a lie"

为了理解toBetoEqual之间的区别,让我们设想三个对象。

代码语言:javascript
运行
复制
var a = { bar: 'baz' },
    b = { foo: a },
    c = { foo: a };

使用严格比较(===),有些东西是“相同的”:

代码语言:javascript
运行
复制
> b.foo.bar === c.foo.bar
true

> b.foo.bar === a.bar
true

> c.foo === b.foo
true

但有些东西,即使它们是“平等的”,也不是“相同的”,因为它们代表的是生活在记忆中不同位置的物体。

代码语言:javascript
运行
复制
> b === c
false

Jasmine的toBe匹配器不过是一个严格等式比较的包装器

代码语言:javascript
运行
复制
expect(c.foo).toBe(b.foo)

是同一件事

代码语言:javascript
运行
复制
expect(c.foo === b.foo).toBe(true)

不要只相信我的话,请看toBe的源代码

但是bc表示功能上等价的对象;它们看起来都像

代码语言:javascript
运行
复制
{ foo: { bar: 'baz' } }

如果我们可以说bc是“平等的”,即使它们不代表相同的对象,这不是很好吗?

输入toEqual,它检查“深度相等”(即对对象进行递归搜索,以确定其键的值是否等效)。以下两项测试都将通过:

代码语言:javascript
运行
复制
expect(b).not.toBe(c);
expect(b).toEqual(c);

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

票数 574
EN

Stack Overflow用户

发布于 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。

现在,您至少可以理解为什么:

代码语言:javascript
运行
复制
var objectOne = {
    propertyOne: str,
    propertyTwo: num    
}

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

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

这是因为,正如这是一个不同但相似的问题的答案,中所述,===运算符实际上意味着两个操作数引用相同的对象,或者在值类型的情况下,具有相同的值。

票数 109
EN

Stack Overflow用户

发布于 2014-08-05 03:37:37

引用茉莉花github项目,

expect(x).toEqual(y);比较对象或原语x和y,如果它们是等价的,则传递它们。 expect(x).toBe(y);比较对象或原语x和y,如果它们是相同的对象,则传递

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22413009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档