#ruby-on-rails #ruby #rspec #automated-tests #tdd
Вопрос:
Я пытаюсь протестировать приведенный ниже метод в своей игре connect-four. Когда игрок пытается поместить фигуру в полный столбец, :puts
на экране появляется сообщение об ошибке.
Проблема, с которой я сталкиваюсь, заключается в том, что тест проходит независимо от того, ввожу ли я доску с полным столбцом или пустым столбцом. Я также вижу это сообщение об ошибке: WARNING: An expectation of `:puts` was set on `nil`.
которое я интерпретирую как означающее, что значение board
или @player
неправильно передается в окончательное expect()
назначение.
Где я ошибаюсь в этом тесте? Спасибо!
Тестируемый метод:
def valid_vertical_move
until @game_board.board[5][@player - 1] == '.'
puts 'Please place piece in valid spot'
player_selection
end
end
Это один из многих тестов, которые я пробовал:
describe Game do
describe '#valid_vertical_move' do
subject(:valid_move) { described_class.new(new_board) }
let(:new_board) {double('new_board', :board => [['x', 'x', 'x', 'x', '.', '.', '.'],
['y', '.', '.', '.', '.', '.', '.'], ['y', '.', '.', '.', '.', '.', '.'],
['y', '.', '.', '.', '.', '.', '.'], ['x', '.', '.', '.', '.', '.', '.'],
['x', '.', '.', '.', '.', '.', '.']])}
context 'when the column is full' do
before do
allow(valid_move).to receive(:player_selection)
end
it 'an error message is :puts' do
error_message = 'Please place piece in valid spot'
test = valid_move.valid_vertical_move
expect(test).to receive(:puts).with(error_message)
end
end
end
end
Игровой Класс:
class Game
attr_reader :player
def initialize(game_board = Board.new)
@game_board = game_board
@player_turn = 1
@player = 0
end
def player_selection
loop do
puts "Choose a column, Player #{@player_turn}:"
@user_input = gets.chomp
if @user_input.match?(/b[1-7]b/)
return @player = @user_input.to_i
else
puts 'Error: Add number between 1-7'
end
end
end
def valid_vertical_move
until @game_board.board[5][@player - 1] == '.'
puts 'Please place piece in valid spot'
player_selection
end
end
end
Класс правления:
class Board
attr_reader :board
def initialize(board = Array.new(6) { Array.new(['.', '.', '.', '.', '.', '.', '.']) })
@board = board
end
def display_board(board = @board)
puts "| #{board[5][0]} | #{board[5][1]} | #{board[5][2]} | #{board[5][3]} | #{board[5][4]} | #{board[5][5]} | #{board[5][6]} |"
puts "| #{board[4][0]} | #{board[4][1]} | #{board[4][2]} | #{board[4][3]} | #{board[4][4]} | #{board[4][5]} | #{board[4][6]} |"
puts "| #{board[3][0]} | #{board[3][1]} | #{board[3][2]} | #{board[3][3]} | #{board[3][4]} | #{board[3][5]} | #{board[3][6]} |"
puts "| #{board[2][0]} | #{board[2][1]} | #{board[2][2]} | #{board[2][3]} | #{board[2][4]} | #{board[2][5]} | #{board[2][6]} |"
puts "| #{board[1][0]} | #{board[1][1]} | #{board[1][2]} | #{board[1][3]} | #{board[1][4]} | #{board[1][5]} | #{board[1][6]} |"
puts "| #{board[0][0]} | #{board[0][1]} | #{board[0][2]} | #{board[0][3]} | #{board[0][4]} | #{board[0][5]} | #{board[0][6]} |"
puts " 1 | 2 | 3 | 4 | 5 | 6 | 7 "
end
end
Ответ №1:
В основном вы ожидаете, что ноль test = valid_move.valid_vertical_move
получит вызов метода, что, похоже, не то, что вы здесь хотите сделать. Вы хотели бы вызвать или зарегистрировать здесь какую-либо ошибку, а затем протестировать ее на наличие рельсов.регистратор, чтобы принять какой-то звонок или что-то в этом роде.