我应该如何避免使用Sinon.js存根属性

时间:2013-08-02 07:24:13

标签: javascript sinon

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

我该怎么想这个?

2 个答案:

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