2013-08-02 30 views
4

我发现Sinon不会让你存根属性,只有方法。我试图找出如何处理/拥抱这个。我应该如何避免使用Sinon.js的存根属性

我有以下代码:

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只存根属性,而不是方法。

我应该如何思考这个问题?

回答

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; 
    }); 
}); 
+0

谢谢 - 这在回顾过程中显得很明显。 – michael

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; 
    }); 
}); 

对实例的属性 - 在太聪明约 它没有任何意义。我仍然建议你不要这样做。