首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Jest中“toBe”和“toEqual”有什么区别?

在Jest中“toBe”和“toEqual”有什么区别?
EN

Stack Overflow用户
提问于 2017-07-19 15:30:35
回答 5查看 104.8K关注 0票数 143

开玩笑的文件如下:

toBe只是检查一个值是否是您所期望的。它使用===检查严格的等式。

对于toEqual

如果要检查两个对象的值是否相同,请使用.toEqual。这个匹配器递归地检查所有字段的相等性,而不是检查对象标识--这也被称为“深度相等”。例如,toEqual和toBe在这个测试套件中的行为不同,所以所有的测试都通过了。

代码语言:javascript
运行
复制
const x = { a: { b: 3 } };
const y = { a: { b: 3 } };

expect(x).toEqual(y);
expect(x).toBe(y);

在本例中,toEqual通过,但toBe失败。我理解toEqual通过是因为它做了一个深度相等的检查。为什么toBe在这种情况下失败了?

此外,是否存在使用toBetoEqual的最佳实践(不仅在Jest中,而且在其他测试框架中也是如此)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-07-20 08:38:28

它失败了,因为xy是不同的实例,不等于(x === y) === false中的实例。您可以将toBe用于字符串、数字或布尔值等原语,其他任何东西都可以使用toEqual。例如

代码语言:javascript
运行
复制
x = 4 
y = 4
x === y // true

x = 'someString'
y = 'someString'
x === y // true

即使是空对象也不相等。

代码语言:javascript
运行
复制
x = {}
y = {}
x === y //false
票数 118
EN

Stack Overflow用户

发布于 2020-06-20 15:11:42

假设有两个名字相同的球员,他们都得了20分。

代码语言:javascript
运行
复制
let player1 = {
    name: "Amit",
    score: 20,
}

let player2 = {
    name: "Amit",
    score: 20,
}

,现在我有了一个函数,它给了我第一个玩家。

代码语言:javascript
运行
复制
function getFirstPlayer(player1,player2){
    return player1;
}

我将如何测试这个函数?

代码语言:javascript
运行
复制
# 1st way
expect(getFirstPlayer(player1,player2)).toBe(player1); // Passes
expect(getFirstPlayer(player1,player2)).not.toBe(player2); // Passes

# 2nd way
expect(getFirstPlayer(player1,player2)).toEqual(player1); // Pases
expect(getFirstPlayer(player1,player2)).not.toEqual(player2); // Fails

toBe测试标识和toEqual测试特性。因此,双胞胎可以有相同的特征,但他们的真实身份是不同的。按照设计这个函数的方式,我们应该使用toBe

,现在我有了另一个函数,它可以增加玩家的分数.

代码语言:javascript
运行
复制
function addScore(player,scoreToAdd){
    player.score += scoreToAdd;
}

我将如何测试这个函数?

代码语言:javascript
运行
复制
# 1st way
addScore(player1,20);
expect(player1).toBe({name:"Amit", score:40});  // Fails

# 2nd way
addScore(player1,20);
expect(player1).toEqual({name:"Amit", score:40});  // Passes

你注意到了吗,在第一条道路上,我们正在通过一个新的球员,像实体在右手边。player1是否有可能与新创建的实体具有相同的身份?不是的。因此,在这种情况下,toBe总是失败的。

第二条通道,就像在toEqual中一样,我们正在比较特性。这里,player1和新创建的实体具有相同的特性。

注释:在javascript的上下文中,"Amit"这样的原语值本身就是身份。所以

代码语言:javascript
运行
复制
expect("Amit").toBe("Amit") // Passes

我已经为特殊情况编写了这个答案,当您了解到身份和特性时,您可以在您的场景中实现它。

票数 23
EN

Stack Overflow用户

发布于 2020-03-26 16:48:59

你也有toStrictEqual()Jest v23开始

解释:https://jestjs.io/docs/en/expect#tostrictequalvalue

有一个Jest的ESLint插件,它有一个规则来强制执行toStrictEqual()https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/prefer-strict-equal.md

npm install --save-dev eslint-plugin-jest

代码语言:javascript
运行
复制
// .eslintrc.js
module.exports = {
  extends: [
    'plugin:jest/recommended'
  ],

  rules: {
    'jest/prefer-strict-equal': 'error'
  }
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45195025

复制
相关文章

相似问题

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