rspec检查一个方法是否调用另一个方法

时间:2016-07-14 01:52:41

标签: ruby rspec tdd

在编写测试以检查实例变量是否等于某个值然后它应该调用某个方法时,我非常困难,如果它小于该值,那么它不应该。我有一个实例变量@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

1 个答案:

答案 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来定义游戏实例。请注意,letlazily evaluated。意味着它仅在示例块中引用时执行。如果在initialize方法中将实例变量设置为0,则测试将正常工作。

请注意,我将@counter设置为8,然后我触发increment_counter方法来测试它是否调用tie_game?

PS:tie_game应该是一个布尔方法吗? play_again是否返回布尔值。我不确定它是否应该是布尔方法。