繁体   English   中英

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

[英]How should I avoid stubbing properties with Sinon.js

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

我该怎么想这个?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM