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

标签 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

最佳答案

您应该检查 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/

相关文章:

ruby - Rails 2.3.5 嵌套路由替换/删除路由

ruby - 我怎样才能用Nokogiri到达这个节点?

ruby - 在 rails 3 和 ruby​​ 1.9.2 中需要 ruby​​ 模块的正确位置是什么?

clojure - 'provided' 在 Midje 的事实中是如何实现的?

ruby - 如何使用 Regex 匹配前面没有 "="的单词?

ruby - RSpec Gem 似乎没有安装依赖项

ruby-on-rails - 如何分离进行 api 调用的 Rails Rspec 测试

ruby - 了解:[] use in rpec test

tdd - TDD FIRST原则

ruby-on-rails - session 哈希不会在 rspec 测试中持续存在