簡體   English   中英

NoMethodError:在gets.chomp上運行Ruby Rspec時nil:NilClass的未定義方法“chomp”

[英]NoMethodError: undefined method `chomp' for nil:NilClass while running Ruby Rspec on gets.chomp

這是我在此的頭一篇博文。 我對 Ruby 相當陌生,尤其是 RSpec,並且一直遇到問題。 我編寫了一個使用gets.chomp 接收玩家輸入的方法。 但是我在另一種方法中調用了這個方法

def prompt_move
        loop do     
            @move = gets.chomp.to_i 
            return move if valid_move?(move)                    
            puts "Invalid input. Enter a column number between 1 and 7"
        end
    end

    def valid_move?(move)
        @move.is_a?(Integer) && @move.between?(1, 7)
    end

    def play_round
        print_board
        prompt_player
        @move = prompt_move     
    end     

這是我的 RSpec 測試的代碼:

describe ConnectFour do
  subject(:game) { described_class.new }
    let(:player){ double(Player) }

describe '#prompt_move' do      
        context 'move is a valid input' do          
            before do
                allow(game).to receive(:gets).and_return('3\n')
            end
            
            it 'returns move and stops the loop' do
                error_message = 'Invalid input. Enter a column number between 1 and 7'
                expect(game).to_not receive(:puts).with(error_message)              
                game.prompt_move
            end
        end
            
        context 'when given one invalid input, then a valid input' do
            before do
                letter = 'a'
                valid_input = '1'
                allow(game).to receive(:gets).and_return(letter, valid_input)
            end

            it 'completes loop and displays error message once' do                          
                error_message = 'Invalid input. Enter a column number between 1 and 7'              
                expect(game).to receive(:puts).with(error_message).once             
                game.prompt_move
            end
        end
    end

如果我從 #play_round 中刪除 #prompt_move 方法,則測試通過,沒有任何問題。 但是,當我嘗試從 #play_round 中調用它時,它給了我 NoMethodError: undefined method `chomp' for nil:NilClass

我一直在努力找出導致此錯誤的原因,因此我們將不勝感激任何建議!

您正在執行類文件中的代碼。

new_game = ConnectFour.new
new_game.play_game

這將在您每次加載文件時運行,例如在測試時。 它將提示輸入並運行gets 它得到的是測試文件的代碼(出於某些 rspec 原因)。 這是無效的,所以它會一直運行gets直到最終沒有更多輸入gets返回nil

從你的類文件中刪除它。 像這樣的代碼應該在一個需要該類的單獨文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM