Javascript 如何避免使用Sinon.js存根属性
我发现Sinon不允许使用存根属性,只允许使用方法。我正在想办法处理/接受这个问题 我有以下代码:Javascript 如何避免使用Sinon.js存根属性,javascript,sinon,Javascript,Sinon,我发现Sinon不允许使用存根属性,只允许使用方法。我正在想办法处理/接受这个问题 我有以下代码: var Player = { addPoints: function(points) { this.score += points; }, score: 0 } var Game = { setPlayers: function(players) { this.players = players; }, over: function() { ret
var Player = {
addPoints: function(points) {
this.score += points;
},
score: 0
}
var Game = {
setPlayers: function(players) {
this.players = players;
},
over: function() {
return this.players.some(function(player) {
return player.score >= 100;
});
},
}
我写了一个测试:
describe("Game", function() {
it("is over if a player has at least 100 points", function() {
var game = Object.create(Game);
player = Object.create(Player);
game.setPlayers([player]);
player.addPoints(100);
game.over().should.be.true;
});
});
当我在测试游戏时,不得不在Player
上调用addPoints()
对我来说是不对的。我最初的本能是存根Player.points
,但我不能这样做,因为Sinon只存根属性,而不是方法
我该怎么想呢?你不必存根游戏。积分只要设定即可。因此,您可以为游戏
创建一个简单的模拟,它只是一个对象
为setPlayer
方法持有间谍。然后,您可以在测试中将分数设置为您想要的任何分数
describe("Game", function() {
var game;
before(function(){
game = {addPoints: jasmine.createSpy()}
})
it("is over if a player has at least 100 points", function() {
game.score = 100;
player = Object.create(Player);
game.setPlayers([player]);
game.over().should.be.true;
});
});
我通过电子邮件发送了SinonJS的邮件列表,作者回信:
跟你做的一模一样。直接写入score属性
完全违背了addPoints方法的目的,使您的
测试与实现紧密耦合(从而使其变得脆弱)
如果您真的想“存根”该属性,请按照以下方法操作:
这是一个实例上的属性,没有必要太聪明
信息技术不过我还是建议你不要这样做
谢谢——回想起来,这似乎是显而易见的。
describe("Game", function() {
it("is over if a player has at least 100 points", function() {
var game = Object.create(Game);
player = Object.create(Player);
game.setPlayers([player]);
player.score = 100;
game.over().should.be.true;
});
});