我在Minitest::Mock
中遇到了一些奇怪的行为,无法弄清楚其背后的原因是什么。
说我有一个类A,它具有方法b
并调用方法c
:
class A
def b
c
end
def c
1
end
end
我想模拟c
方法以返回2而不是1:
require 'minitest/autorun'
a = Minitest::Mock.new(A.new)
a.expect(:c, 2)
但是由于某些原因,b
仍返回1:
> a.b
=> 1
显然可以直接调用c
:
> a.c
=> 2
> a.c
MockExpectationError: No more expects available for :c: []
为什么从实例中调用c
时没有期望?
答案 0 :(得分:0)
Minitest::Mock
的工作方式是这样;模拟对象是A
的“真实”实例的包装,并且定义的期望在到达该实例之前拦截了该方法调用。 (其他未定义期望的方法,例如b
,会在不受影响的情况下转发,尽管它们仍会通过模拟传递。)
当实例在内部进行方法调用时,它们直接进入self
,而不是通过模拟包装返回,因此它们被正常分派,没有被拦截的机会。
答案 1 :(得分:0)
找到了一个很棒的宝石,可以很好地解决这个问题:
https://github.com/bogdanvlviv/minitest-mock_expectations
assert_called a, :c do
a.b
end