我无法弄清楚如何编写可以运行的测试,该测试也不会在CL的脚本中运行任何内容。当@counter为9时,应该触发#tie_game?但它不起作用。@counter初始化为0,并且每当玩家在游戏板上放一个X或O时,它都会加1。我该如何测试@counter为9时调用tie_game的情况?并且当它小于9时不会吗?
def initialize(player1, player2)
@player1 = player1
@player2 = player2
@rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
@wins = [1, 2, 3], [4, 5, 6], [7, 8, 9],
[1, 4, 7], [2, 5, 8], [3, 6, 9],
[1, 5, 9], [3, 5, 7]
@selected_numbers = []
@counter = 0
end
def increment_counter
@counter += 1
if @counter == 9
tie_game?
end
end
def tie_game?
puts "The game was a tie. Nicely played #{@player1} & #{@player2}!"
play_again
end
我尝试过:您能解释一下为什么它不起作用吗?
describe "increment_counter" do
context "counter equals 9" do
it "calls tie_game?" do
game.instance_variable_set(:@counter, 9)
allow(game).to receive(:increment_counter)
#expect(STDOUT).to receive(:puts).with("The game was a tie. Nicely played #{@player1} & #{@player2}!")
expect(game).to receive(:tie_game?)
end
end
context "counter is less than 9" do
it "does not call tie_game?" do
game.instance_variable_set(:@counter, 4)
game.increment_counter
expect(game).not_to receive(:tie_game?)
end
end
end
RSpec Mocks为您做到这一点。
describe TicTacToe do
let(:game) { TicTacToe.new }
context "after fewer than 9 moves" do
it "does not call tie_game?" do
expect(game).not_to receive(:tie_game?)
8.times { game.increment_counter }
end
end
context "after 9 moves" do
it "calls tie_game?" do
expect(game).to receive(:tie_game?)
9.times { game.increment_counter }
end
end
end
有关更多详细信息,请参见https://relishapp.com/rspec/rspec-mocks/v/3-5/docs/basics/expecting-messages。
作为附带说明,tie_game?可能不应该在后面加上问号。tie_game?建议检查游戏是否并列。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句