假设有两个名字相同的玩家,他们都得了20分。
let player1 = {
name: "Amit",
score: 20,
}
let player2 = {
name: "Amit",
score: 20,
}
现在我有一个函数可以给我第一玩家。
function getFirstPlayer(player1,player2){
return player1;
}
我该如何测试这个函数?
expect(getFirstPlayer(player1,player2)).toBe(player1); // Passes
expect(getFirstPlayer(player1,player2)).not.toBe(player2); // Passes
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});
# 2nd way
addScore(player1,20);
expect(player1).toEqual({name:"Amit", score:40});
你有没有注意到在第一种方法中,我们在右边传递了一个新的类似于实体的玩家。是否有可能player1
具有与新创建的实体相同的标识?没有。因此,在这种情况下toBe
将始终失败。
第二种方法是如此传递,因为在toEqual
中我们正在比较特征。这里player1
和新创建的实体具有相同的特征。
注意:在javascript的上下文中,像"Amit"
这样的原始值本身就是标识。所以
expect("Amit").toBe("Amit") // Passes
我为特定情况编写了这个答案,当您获得身份和特征的想法后,可以在您的场景中实施它。
Object.is
。