在编写一个测试来检查实例变量是否等于某个值时,我非常困惑,那么它应该调用某个方法,如果它小于该值,那么它不应该调用。我有一个实例变量 @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
最佳答案
您应该检查 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
是延迟计算的
。这意味着它仅在示例 block 中引用时执行。如果您在 initialize
方法中将实例变量设置为 0,则测试将正常工作。
请注意,我将 @counter
设置为 8,然后触发 increment_counter
方法来测试它是否调用 tie_game?
PS:tie_game
应该是 bool 方法吗? play_again
是否返回 bool 值。我不确定它是否应该是 bool 方法。
关于ruby - rspec 检查一个方法是否调用另一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38364309/