我发现Sinon不会让你存根属性,只有方法。我正试图弄清楚如何处理/拥抱这个。
我有以下代码:
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;
});
});
当我正在测试addPoints()
时,我必须在Player
上拨打Game
,这是错误的。我最初的本能是存根Player.points
,但我不能这样做,因为Sinon只存根属性,而不是方法。
我该怎么想这个?
答案 0 :(得分:6)
我通过电子邮件发送了SinonJS邮件列表,作者回信:
正如你所做的那样。直接写入得分属性 完全违背了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;
});
});
这是一个实例上的属性 - 没有必要过于聪明 它。我仍然建议你不要这样做。
答案 1 :(得分:2)
您不必设置存根game.points
。因此,您可以为Game
创建一个简单的模拟,这只是object
持有setPlayer
方法的间谍。然后你可以在测试中将score
设置为你想要的。
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;
});
});