在编写测试以检查实例变量是否等于某个值然后它应该调用某个方法时,我非常困难,如果它小于该值,那么它不应该。我有一个实例变量@counter,初始化为0,这些方法:
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
我想写一个测试来检查当@counter等于9时,那个tie_game?被调用,当它小于9时,它不被调用。
这是我能想到的,但这是错误的:
describe "increment_counter" do
context "counter equals 9" do
it "calls tie_game?" do
game.instance_variable_set(:@counter, 9)
expect(increment_counter).to receive(:tie_game?)
end
end
end
答案 0 :(得分:2)
您应该检查tie_game?
实例上是否调用game
而不是increment_counter
。使用您提供的代码,一种方法是
describe "increment_counter" do
context 'counter equals 9' do
let(:game) { Game.new }
it 'calls tie_game?' do
game.instance_variable_set(:@counter, 8)
game.increment_counter
expect(game).to receive(:tie_game?)
end
it 'does not call tie_game?' do
game.increment_counter
expect(game).not_to receive(:tie_game?)
end
end
端
我假设您的班级名称为Game
。由于您的示例都需要game
实例,我们可以将其干掉并使用let
来定义游戏实例。请注意,let
为lazily evaluated
。意味着它仅在示例块中引用时执行。如果在initialize
方法中将实例变量设置为0,则测试将正常工作。
请注意,我将@counter
设置为8,然后我触发increment_counter
方法来测试它是否调用tie_game?
PS:tie_game
应该是一个布尔方法吗? play_again
是否返回布尔值。我不确定它是否应该是布尔方法。