我将此方法作为更大类的一部分。我正在尝试为其编写测试,但我是 rspec 的新手,我有点难过......如果我在 9.times 循环中注释掉所有内容,我可以测试“drawgrid”。但如果我取消注释该代码,则当前测试失败。我需要测试 play 方法...运行游戏。它放置'drawgrid'......运行游戏序列9次,在每轮之后放置'drawgrid'。但我不确定该怎么做。非常感谢任何指点。
下面是播放方法和当前规范
def play
#draw the board
puts drawgrid
#make a move
turn = 0
9.times do
if turn.even?
@player = @player_h.move_human("X", @board)
@move = @player.to_sym
@marker = @player_h.boardpiece
does_move_exist(@move,@marker)
is_a_human_win(@board)
else
@player = @player_c.move_computer("O", @board)
@move = @player
@marker = @player_c.boardpiece
does_move_exist(@move,@marker)
is_a_computer_win(@board)
end
puts drawgrid
turn += 1
end # 9.times ends
end
当前规范....
describe 'play method' do
it 'draws the game grid' do
@player_human = Player.new('X')
@player_computer = Player.new('O')
@board = Board.new
@game = Game.new(@player_human, @player_computer, @board)
@game.should_receive(:puts).with("\na | | \n----------\nb | | \n----------\nc | | \n----------\n 1 2 3\n")
@game.play
end
end
describe '9.times' do
it 'runs game sequence 9 times...once per board spot' do
@player_human2 = Player.new('X')
@player_computer2 = Player.new('O')
@board2 = Board.new
@game2 = Game.new(@player_human2, @player_computer2, @board2)
turn = 0
9.times do
if turn.even?
@player_human2.should_receive(:puts).with("human move...")
@player_human2.stub(:gets).and_return("b2")
else
@player_human2.should_receive(:puts).with("computer move...")
@player_human2.stub(:gets).and_return("a1")
end
turn += 1
end
@game2.play
end
end
最佳答案
总的来说,我觉得您的代码和测试都试图在一种方法中做太多事情。关于您的 play 方法的有趣之处与其说是 9 次,不如说是该循环内部发生的事情。我对重构的第一个建议是将该循环内部的内容转换为名为“take_turn”或类似名称的方法。
然后您可以为单个回合发生的情况编写规范。而且,您对 play 方法的规范将测试 take_turn 方法被调用了 9 次。
这并不是说您不能保持代码原样并为其编写有效的测试……您只是不能对您正在测试的内容进行 super 外科手术。
希望对您有所帮助。
关于ruby - 如何为一种方法编写 rspec 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12963214/