Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何避免使用Sinon.js存根属性_Javascript_Sinon - Fatal编程技术网

Javascript 如何避免使用Sinon.js存根属性

Javascript 如何避免使用Sinon.js存根属性,javascript,sinon,Javascript,Sinon,我发现Sinon不允许使用存根属性,只允许使用方法。我正在想办法处理/接受这个问题 我有以下代码: var Player = { addPoints: function(points) { this.score += points; }, score: 0 } var Game = { setPlayers: function(players) { this.players = players; }, over: function() { ret

我发现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;
  });
});
当我在测试
游戏时,不得不在
Player
上调用
addPoints()
对我来说是不对的。我最初的本能是存根
Player.points
,但我不能这样做,因为Sinon只存根属性,而不是方法


我该怎么想呢?

你不必存根
游戏。积分
只要设定即可。因此,您可以为
游戏
创建一个简单的模拟,它只是一个
对象
setPlayer
方法持有间谍。然后,您可以在测试中将
分数设置为您想要的任何分数

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

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