Тест Rspec Всегда Проходит Независимо От Ввода

#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 получит вызов метода, что, похоже, не то, что вы здесь хотите сделать. Вы хотели бы вызвать или зарегистрировать здесь какую-либо ошибку, а затем протестировать ее на наличие рельсов.регистратор, чтобы принять какой-то звонок или что-то в этом роде.