2016-07-14 14 views
1

Ich bin sehr fest, wenn es darum geht, einen Test zu schreiben, um zu überprüfen, ob eine Instanzvariable einen bestimmten Wert hat, dann sollte es eine bestimmte Methode aufrufen, und wenn es kleiner als dieser Wert ist , dann sollte es nicht. Ich habe eine Instanzvariable, @Counter, die bei 0 initialisiert wird, und diese Methoden:rspec Überprüfen, ob eine Methode eine andere Methode aufruft

def increment_counter 
    @counter += 1 

    if @counter == 9 
     tie_game? 
    end 
end 

def tie_game? 
    puts "The game was a tie. Nicely played #{@player1} & #{@player2}!" 
    play_again 
end 

Ich möchte einen Test schreiben, dass zu überprüfen, wenn @Counter gleich 9 ist, dass tie_game? heißt, und wenn es weniger als 9 ist, wird es nicht aufgerufen.

Dies ist, was ich tun konnte, aber es ist falsch:

describe "increment_counter" do 
    context "counter equals 9" do 
     it "calls tie_game?" do 
      game.instance_variable_set(:@counter, 9) 
      expect(increment_counter).to receive(:tie_game?) 

     end 
    end 
end 

Antwort

1

Sie sollten, ob überprüfen tie_game? auf der game Instanz aufgerufen wurde und nicht der increment_counter. Mit dem Code, die Sie gegeben haben, eine Möglichkeit, dies zu tun, wäre

describe "increment_counter" do 
    context 'counter equals 9' do 
    let(:game) { Game.new } 
    it 'calls tie_game?' do 
     game.instance_variable_set(:@counter, 8) 
     game.increment_counter 
     expect(game).to receive(:tie_game?) 
    end 

    it 'does not call tie_game?' do 
     game.increment_counter 
     expect(game).not_to receive(:tie_game?) 
    end 
end 

Ende

Ich gehe davon aus, dass Ihre Klassennamen Game ist. Da beide Beispiele eine Instanz benötigen, können wir sie austrocknen und let verwenden, um die Spielinstanz zu definieren. Beachten Sie, dass letlazily evaluated ist. Bedeutung wird nur ausgeführt, wenn es im Beispielblock referenziert wird. Wenn Sie die Instanzvariable in der initialize-Methode auf 0 setzen, funktionieren die Tests einwandfrei.

Bitte beachte, dass ich @counter bis 8 setze und dann, ob ich auslösenden increment_counter Methode zu testen es tie_game?

PS ruft: Sollte tie_game eine boolean Methode sein? Gibt play_again einen Boolean zurück. Ich bin nicht sicher, ob es eine boolesche Methode sein sollte.

+0

danke für Ihren Rat. Dies scheint zu funktionieren, aber wenn ich es im Terminal ausführe, bevor es mich über irgendwelche Fehler informiert, wird die Methode play_again ausgeführt. Weißt du, wie ich dafür sorgen sollte, dass es das nicht macht? –

Verwandte Themen