2016-07-14 9 views
1

私はCLのスクリプトで何も動作しない、動作するテストを書く方法を理解できません。 @counterが9のとき、#tie_gameをトリガするはずですか?それは動作しません。 @counterは0に初期化され、プレーヤーがXまたはOをゲームボードに置くたびに1ずつインクリメントされます。 @counterがtie_gameを呼び出すと9回テストする方法はありますか?それが9未満ではそれはしないでしょうか?メソッドが呼び出されたらrspecテスト

def initialize(player1, player2) 
    @player1 = player1 
    @player2 = player2 
    @rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

    @wins = [1, 2, 3], [4, 5, 6], [7, 8, 9], 
     [1, 4, 7], [2, 5, 8], [3, 6, 9], 
     [1, 5, 9], [3, 5, 7] 

    @selected_numbers = [] 
    @counter = 0 
end 

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 

私はこれを試しました:なぜそれがうまくいかないのか説明できますか?

describe "increment_counter" do 
    context "counter equals 9" do 
     it "calls tie_game?" do 
      game.instance_variable_set(:@counter, 9) 
      allow(game).to receive(:increment_counter) 
      #expect(STDOUT).to receive(:puts).with("The game was a tie. Nicely played #{@player1} & #{@player2}!") 
      expect(game).to receive(:tie_game?) 
     end 
    end 
    context "counter is less than 9" do 
     it "does not call tie_game?" do 
      game.instance_variable_set(:@counter, 4) 
      game.increment_counter 
      expect(game).not_to receive(:tie_game?) 
     end 
    end 
end 
+0

回答を投稿した後で編集を見ました。それがあなたのために働いていない理由は、あなたが期待を設定した後であなたのコードを実際に呼び出すことは決してないということです。メッセージを送受信するかどうかをテストするときは、期待/実行順序を逆転させる必要があります。 – JasonK

+0

大丈夫です。お返事ありがとうございました。確かに意味が分かります –

答えて

3

RSpecの、spec_helper.rbあなたのテストでその後

Foo.prepend TrackMethods[:tie_game?] 

、中TrackMethods

module TrackMethods 
    # A global variable that stores how many times a method is called. 
    $method_calls = Hash.new(0) 

    def self.[](*method_names) 
    Module.new do 
     method_names.each do |name| 
     define_method name do |*args, &block| 
      $method_calls[name] += 1 
      super(*args, &block) 
     end 
     end 
    end 
    end 
end 

次に言いますモックはあなたのためにこれを行います。

詳細については、https://relishapp.com/rspec/rspec-mocks/v/3-5/docs/basics/expecting-messagesを参照してください。

サイドノートとして、tie_game?おそらくそれの後に疑問符を持つべきではありません。 tie_game?ゲームが縛られているかどうかを調べることを示唆しています。

+0

ありがとうございます、これのためにたくさんのコードを削除することができました。 –

+0

サイドノート。ダブルスなしでは 'have_received'を使うことはできません。この例のように 'receive'をテストしなければなりません。 –

0

これは興味深い質問です。私のアプローチは、クラスをサルパッチして、テストで検出できるいくつかの副作用をもたらすメソッドtie_game?を再定義します。

クラス名が表示されないので、それをFooとしましょう。

はまず、モジュールを作成し、することができます

expect($method_calls[:tie_game?]).to be > 0 
+0

あなたの返事に感謝して、私はちょうど私のOPに編集を行いました –

関連する問題