2013-08-02 5 views
4

Я обнаружил, что Sinon не позволяет вам заглушать свойства, а только методы. Я пытаюсь понять, как бороться с этим.Как следует избегать stubbing-свойств с помощью Sinon.js

Я следующий код:

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

Вам не нужно заглушить 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; 
    }); 
}); 
+0

Спасибо, что кажется очевидным в ретроспективе. – michael

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

Это свойство на примере - нет смысла быть слишком умным о это. Я по-прежнему рекомендую, чтобы вы этого не делали.

Смежные вопросы