2016-07-14 7 views
1

インスタンス変数が特定の値に等しいかどうかをチェックするためのテストを作成するときに、特定のメソッドを呼び出す必要があります。 、そうすべきではない。私は、インスタンス変数、0に初期化され@counter、およびこれらのメソッドを持っている:1つのメソッドが別のメソッドを呼び出すかどうかを調べる

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 

私は@counterが9に等しい場合、そのtie_gameをことを確認するためのテストを書きたいですか?それが9より小さい時は呼び出されません。

これは私が思い付くことができるものであるが、それは間違っている:

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 

答えて

1

あなたはtie_game?gameインスタンスではなくincrement_counterで呼び出されたかどうかを確認する必要があります。あなたが与えているコードで、これを実行するための1つの方法は、私はあなたのクラス名がGameであると仮定しています

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 

終わりだろう。両方の例ではgameインスタンスが必要なので、ゲームインスタンスを定義するには乾燥させてletを使用します。 letlazily evaluatedです。意味は、それがexampleブロックで参照されているときにのみ実行されます。 initializeメソッドでインスタンス変数を0に設定した場合、テストは正常に動作します。私は8に@counterを設定していますし、私はそれがtie_game?

PSを呼び出すかどうかをテストするためのincrement_counterメソッドをトリガーしています

注:tie_gameブールメソッドであるべきでしょうか? play_againはブール値を返しますか?ブール値メソッドであるかどうかはわかりません。

+0

あなたの助言に感謝します。これは動作しているようですが、ターミナルで実行すると、失敗したことを知らせる前にplay_againメソッドが実行されます。あなたがそれをしないことをどうやって確認しなければならないか知っていますか? –

関連する問題