开玩笑的文件如下:
toBe只是检查一个值是否是您所期望的。它使用===检查严格的等式。
对于toEqual
如果要检查两个对象的值是否相同,请使用.toEqual。这个匹配器递归地检查所有字段的相等性,而不是检查对象标识--这也被称为“深度相等”。例如,toEqual和toBe在这个测试套件中的行为不同,所以所有的测试都通过了。
const x = { a: { b: 3 } };
const y = { a: { b: 3 } };
expect(x).toEqual(y);
expect(x).toBe(y);
在本例中,toEqual
通过,但toBe
失败。我理解toEqual
通过是因为它做了一个深度相等的检查。为什么toBe
在这种情况下失败了?
此外,是否存在使用toBe
和toEqual
的最佳实践(不仅在Jest中,而且在其他测试框架中也是如此)?
发布于 2017-07-20 08:38:28
它失败了,因为x
和y
是不同的实例,不等于(x === y) === false
中的实例。您可以将toBe
用于字符串、数字或布尔值等原语,其他任何东西都可以使用toEqual
。例如
x = 4
y = 4
x === y // true
x = 'someString'
y = 'someString'
x === y // true
即使是空对象也不相等。
x = {}
y = {}
x === y //false
发布于 2020-06-20 15:11:42
假设有两个名字相同的球员,他们都得了20分。
let player1 = {
name: "Amit",
score: 20,
}
let player2 = {
name: "Amit",
score: 20,
}
,现在我有了一个函数,它给了我第一个玩家。
function getFirstPlayer(player1,player2){
return player1;
}
我将如何测试这个函数?
# 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
。
,现在我有了另一个函数,它可以增加玩家的分数.
function addScore(player,scoreToAdd){
player.score += scoreToAdd;
}
我将如何测试这个函数?
# 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"
这样的原语值本身就是身份。所以
expect("Amit").toBe("Amit") // Passes
我已经为特殊情况编写了这个答案,当您了解到身份和特性时,您可以在您的场景中实现它。
发布于 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
// .eslintrc.js
module.exports = {
extends: [
'plugin:jest/recommended'
],
rules: {
'jest/prefer-strict-equal': 'error'
}
}
https://stackoverflow.com/questions/45195025
复制相似问题