2012-11-27 102 views
0

好吧,所以我是rspec noob,我試圖測試一個位於模塊內部的方法。以下是我的測試文件,我正在測試的代碼以及我得到的錯誤。 任何指導將不勝感激。如何讓我的模塊方法測試通過 - RSPEC錯誤

在此先感謝。

這裏是我的規格文件gamestat_spec.rb

require 'gamestate' 
require 'board' 


describe 'Gamestate module' do 
    before (:each) do 
    @player_human = Player.get_player('X') 
    @player_computer = Player.get_player('O')  
    end 
    describe 'is_a_human_win' do 
    it 'receives current board' do 
     class GamestateTester 
     include ::GameState 
     end 
     human_win_test = GamestateTester.new 
     myboard = Board.new 
     myboard.grid[:a1] = "X" 
     myboard.grid[:b2] = "X" 
     myboard.grid[:c3] = "X" 
     human_win_tester.is_a_human_win(@myboard).should_receive(:puts) 
    end 
    xit 'looks for human win' 
    xit 'if win found returns...Human Wins' 
    end 
    describe 'is_a_computer_win' do 
    xit 'receives current board' 
    xit 'looks for computer win' 
    xit 'if win found returns...Computer Wins' 
    end 
end 

,這裏是模塊文件,我反對...... gamestate.rb測試....

module GameState 

    def is_a_human_win(board) 

    win_moves = { 
    :wm01 => {:a1=>"X", :a2=>" ", :a3=>" ", :b1=>" ", :b2=>"X", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>"X"}, 
    :wm02 => {:a1=>" ", :a2=>"X", :a3=>" ", :b1=>" ", :b2=>"X", :b3=>" ", :c1=>" ", :c2=>"X", :c3=>" "}, 
    :wm03 => {:a1=>" ", :a2=>" ", :a3=>"X", :b1=>" ", :b2=>"X", :b3=>" ", :c1=>"X", :c2=>" ", :c3=>" "}, 
    :wm04 => {:a1=>" ", :a2=>" ", :a3=>" ", :b1=>"X", :b2=>"X", :b3=>"X", :c1=>" ", :c2=>" ", :c3=>" "}, 
    :wm05 => {:a1=>"X", :a2=>"X", :a3=>"X", :b1=>" ", :b2=>" ", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>" "}, 
    :wm06 => {:a1=>" ", :a2=>" ", :a3=>" ", :b1=>" ", :b2=>" ", :b3=>" ", :c1=>"X", :c2=>"X", :c3=>"X"}, 
    :wm07 => {:a1=>"X", :a2=>" ", :a3=>" ", :b1=>"X", :b2=>" ", :b3=>" ", :c1=>"X", :c2=>" ", :c3=>" "}, 
    :wm08 => {:a1=>" ", :a2=>" ", :a3=>"X", :b1=>" ", :b2=>" ", :b3=>"X", :c1=>" ", :c2=>" ", :c3=>"X"} 
    } 

    x_on_the_gameboard = board.grid.select{ |k, v| v == "X" }.keys 


    win_moves.each do |k,v| 
     win_moves_keys = v.select{ |k, v| v == "X"}.keys 

     matching_moves = win_moves_keys & x_on_the_gameboard 

     if matching_moves.length >= 3 

     p 'key: '+k.to_s 

     string_contains = k.to_s 
     if string_contains =~ /wm/ 
      puts "Human Wins" 
      # return 1 
      exit 
     else 

     end 
     end 
    end 
    end 

    def is_a_computer_win(board) 

    ai_winmoves = { 
    :wm01 => {:a1=>"O", :a2=>" ", :a3=>" ", :b1=>" ", :b2=>"O", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>"O"}, 
    :wm02 => {:a1=>" ", :a2=>"O", :a3=>" ", :b1=>" ", :b2=>"O", :b3=>" ", :c1=>" ", :c2=>"O", :c3=>" "}, 
    :wm03 => {:a1=>" ", :a2=>" ", :a3=>"O", :b1=>" ", :b2=>"O", :b3=>" ", :c1=>"O", :c2=>" ", :c3=>" "}, 
    :wm04 => {:a1=>" ", :a2=>" ", :a3=>" ", :b1=>"O", :b2=>"O", :b3=>"O", :c1=>" ", :c2=>" ", :c3=>" "}, 
    :wm05 => {:a1=>"O", :a2=>"O", :a3=>"O", :b1=>" ", :b2=>" ", :b3=>" ", :c1=>" ", :c2=>" ", :c3=>" "}, 
    :wm06 => {:a1=>" ", :a2=>" ", :a3=>" ", :b1=>" ", :b2=>" ", :b3=>" ", :c1=>"O", :c2=>"O", :c3=>"O"}, 
    :wm07 => {:a1=>"O", :a2=>" ", :a3=>" ", :b1=>"O", :b2=>" ", :b3=>" ", :c1=>"O", :c2=>" ", :c3=>" "}, 
    :wm08 => {:a1=>" ", :a2=>" ", :a3=>"O", :b1=>" ", :b2=>" ", :b3=>"O", :c1=>" ", :c2=>" ", :c3=>"O"} 
    } 

    o_on_the_gameboard = board.grid.select{ |k, v| v == "O" }.keys 


    ai_winmoves.each do |k,v| 
     ai_winmoves_keys = v.select{ |k, v| v == "O"}.keys 

     matching_moves = ai_winmoves_keys & o_on_the_gameboard 

     if matching_moves.length >= 3 

     p 'key: '+k.to_s 

     test_string_contains = k.to_s 
     if test_string_contains =~ /wm/ 
      puts "Computer Wins" 
      # return -1 
      exit 
     else 

     end 
     end 
    end 
    end 
end 

這裏是錯誤我越來越....

Failures: 

    1) Gamestate module is_a_human_win receives current board 
    Failure/Error: human_win_tester.is_a_human_win(@myboard).should_receive(:puts) 
    NameError: 
     undefined local variable or method `human_win_tester' for #<RSpec::Core::ExampleGroup::Nested_3::Nested_1:0x007f8ef43fa0b8> 
    # ./spec/gamestate_spec.rb:20:in `block (3 levels) in <top (required)>' 

Finished in 0.01865 seconds 
23 examples, 1 failure, 6 pending 

回答

1

看起來它甚至不是一個Rspec問題,只是紅寶石語法。 :)

這一部分:

class GamestateTester 
    include 'gamestate' 
end 

應該是:

class GamestateTester 
    include ::GameState 
end 
+0

現在我得到這個....未初始化的常量GamestateTester ::遊戲狀態......(道歉我noobness)@pje – thefonso

+0

你也有權要求遊戲狀態文件在你的測試或測試助手中...所以在測試文件的頂部:'require'gamestate''然後將模塊包含在你的GamestateTester類中,如上所示。 –

+0

@thefonso:我編輯了答案。看看[這個答案](http://stackoverflow.com/a/5318496/1004889)更好的解釋。 – pje

0

簡單的老錯字。你在你的對象一個額外的ER)

human_win_test = GamestateTester.new 
... 
human_win_tester.should ....