【问题标题】:rspec check if one method calls another methodrspec 检查一个方法是否调用另一个方法
【发布时间】:2016-11-16 18:53:04
【问题描述】:

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

【问题讨论】:

    标签: ruby rspec tdd


    【解决方案1】:

    您应该检查是否在 game 实例上而不是在 increment_counter 上调用了 tie_game?。使用您提供的代码,一种方法是

    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 是否返回布尔值。我不确定它是否应该是布尔方法。

    【讨论】:

    • 感谢您的建议。这似乎有效,但是当我在终端中运行它时,在它告诉我任何失败之前,它会运行 play_again 方法。你知道我应该如何确保它不会那样做吗?
    猜你喜欢
    • 2020-08-29
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多