6

我发现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()不得不进去打电话给我感觉不对。我最初的直觉是 stub ,但我不能这样做,因为 Sinon 只存根属性,而不是方法。PlayerGamePlayer.points

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

4

2 回答 2

9

我通过电子邮件发送到 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;
  });
});

它是一个实例上的一个属性——没有必要太聪明。我仍然建议你不要这样做。

于 2013-08-02T14:55:06.023 回答
4

您不必存根game.points只需设置它。因此,您可以创建一个简单的模拟 for 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;
  });
});
于 2013-08-02T10:14:00.317 回答