Jasmine JavaScript 测试 - toBe vs toEqual

Jasmine JavaScript Testing - toBe vs toEqual(Jasmine JavaScript 测试 - toBe vs toEqual)
本文介绍了Jasmine JavaScript 测试 - toBe vs toEqual的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有以下内容:

var myNumber = 5;期望(myNumber).toBe(5);期望(myNumber).toEqual(5);

以上两个测试都将通过.toBe() 和 toEqual() 在计算数字时有区别吗?如果是这样,我什么时候应该使用一个而不是另一个?

解决方案

对于原始类型(例如数字、布尔值、字符串等),toBetoEqual没有区别;任何一个都适用于 5true"the cake is a lie".

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

var a = { bar: 'baz' },b = { foo: a },c = { foo: a };

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

<代码>>b.foo.bar === c.foo.bar真的>b.foo.bar === a.bar真的>c.foo === b.foo真的

但是有些东西,即使它们相等",也不是相同的",因为它们代表了存在于内存中不同位置的对象.

<代码>>b === c错误的

Jasmine 的 toBe 匹配器只不过是严格相等比较的包装器

expect(c.foo).toBe(b.foo)

是一样的

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

不要只相信我的话;参见toBe的源代码.p>

但是bc代表功能上等价的对象;他们都长得像

{ foo: { bar: 'baz' } }

如果我们可以说 bc 是相等的",那不是很好吗?即使它们不代表同一个对象?

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

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

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

Let's say I have the following:

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

Both of the above tests will pass. Is there a difference between toBe() and toEqual() when it comes to evaluating numbers? If so, when I should use one and not the other?

解决方案

For primitive types (e.g. numbers, booleans, strings, etc.), there is no difference between toBe and toEqual; either one will work for 5, true, or "the cake is a lie".

To understand the difference between toBe and toEqual, let's imagine three objects.

var a = { bar: 'baz' },
    b = { foo: a },
    c = { foo: a };

Using a strict comparison (===), some things are "the same":

> b.foo.bar === c.foo.bar
true

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

> c.foo === b.foo
true

But some things, even though they are "equal", are not "the same", since they represent objects that live in different locations in memory.

> b === c
false

Jasmine's toBe matcher is nothing more than a wrapper for a strict equality comparison

expect(c.foo).toBe(b.foo)

is the same thing as

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

Don't just take my word for it; see the source code for toBe.

But b and c represent functionally equivalent objects; they both look like

{ foo: { bar: 'baz' } }

Wouldn't it be great if we could say that b and c are "equal" even if they don't represent the same object?

Enter toEqual, which checks "deep equality" (i.e. does a recursive search through the objects to determine whether the values for their keys are equivalent). Both of the following tests will pass:

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

Hope that helps clarify some things.

这篇关于Jasmine JavaScript 测试 - toBe vs toEqual的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)