【问题标题】:How should I avoid stubbing properties with Sinon.js我应该如何避免使用 Sinon.js 存根属性
【发布时间】:2013-08-02 07:24:12
【问题描述】:

我发现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;
  });
});

当我在测试Game 时,我不得不在Player 上打电话给addPoints(),这让我感觉不对。我最初的直觉是存根Player.points,但我不能这样做,因为Sinon只存根属性,而不是方法。

我应该怎么想?

【问题讨论】:

    标签: javascript sinon


    【解决方案1】:

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

    它是一个实例的属性 - 没有必要太聪明 它。不过,我仍然建议您不要这样做。

    【讨论】:

      【解决方案2】:

      您不必存根game.points 只需设置它即可。所以你可以为Game 创建一个简单的模拟,它只是一个objectsetPlayer 方法保存一个间谍。然后您可以在测试中将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;
        });
      });
      

      【讨论】:

      • 谢谢 - 回想起来似乎很明显。
      猜你喜欢
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 2016-12-02
      • 2017-07-12
      • 2012-01-09
      • 2020-07-01
      • 2016-08-16
      • 2015-12-04
      相关资源
      最近更新 更多