使用 MiniTest 测试方法是否被调用 x 次的更好方法?
Better way to test if method is called x times with MiniTest?
今天我从 minitest 的一些基本实现开始,终于想出了一个方法来测试 class 上的方法是否被调用了两次。
在 RSpec 我会做这样的事情:
expect(@foo).to receive(:some_heavy_calculation).once
2.times { @foo.bar }
现在,我已经为 MiniTest 提出了以下实现,但我不确定这是否是实现它的方式,因为 this.这是我得到的
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 次的方法的主题存根的结果?
我不得不做类似的事情。这就是我最终得到的...
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
我在我的一个测试中做了类似的事情。如果您的方法可能调用 class:
的多个实例,这也适用
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
今天我从 minitest 的一些基本实现开始,终于想出了一个方法来测试 class 上的方法是否被调用了两次。
在 RSpec 我会做这样的事情:
expect(@foo).to receive(:some_heavy_calculation).once
2.times { @foo.bar }
现在,我已经为 MiniTest 提出了以下实现,但我不确定这是否是实现它的方式,因为 this.这是我得到的
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 次的方法的主题存根的结果?
我不得不做类似的事情。这就是我最终得到的...
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
我在我的一个测试中做了类似的事情。如果您的方法可能调用 class:
的多个实例,这也适用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