测试方法是否被MiniTest调用x次的更好方法?

时间:2015-01-10 09:43:01

标签: ruby testing mocking minitest

今天我开始介绍minitest的一些基本实现,最后找出了一种方法来测试一个类的方法是否被调用两次。

在RSpec中,我会做类似的事情:

expect(@foo).to receive(:some_heavy_calculation).once
2.times { @foo.bar }

现在,我已经为MiniTest提出了以下实现,但是我不确定这是否是实现它的方法,因为这样。这就是我所拥有的

require 'minitest/autorun'

class Foo
  def bar
    @cached_value ||= some_heavy_calculation
  end

  def some_heavy_calculation
    "result"
  end
end

class FooTest < Minitest::Test
  def setup
    @foo = Foo.new
  end

  def cache_the_value_when_calling_bar_twice
    mock = Minitest::Mock.new
    mock.expect(:some_heavy_calculation, [])
    @foo.stub :some_heavy_calculation, -> { mock.some_heavy_calculation } do
      2.times { assert_equal_set @foo.bar, [] }
    end
    mock.verify
  end
end

我是否真的必须使用mock来实现它,这将是必须被调用x次的方法主题的存根的结果?

2 个答案:

答案 0 :(得分:3)

我必须做类似的事情。这就是我最终的结果......

def cache_the_value_when_calling_bar_twice
  count = 0
  @foo.stub :some_heavy_calculation, -> { count += 1 } do
    2.times { assert_equal_set @foo.bar, [] }
  end
  assert_equal 1, count
end

答案 1 :(得分:0)

我在一项测试中做了类似的事情。如果您的方法可能调用一个类的多个实例,那么这也可以工作:

test "verify number of method calls" do
 count = 0
 Foo.stub_any_instance(:some_heavy_calculation, -> { count += 1 }) do
  2.times { assert_equal_set @foo.bar, [] }
 end
 assert_equal 1, count
end