Minitest-从另一个实例方法中调用模拟的实例方法

时间:2018-07-01 07:49:15

标签: ruby-on-rails ruby mocking minitest

我在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时没有期望?

2 个答案:

答案 0 :(得分:0)

Minitest::Mock的工作方式是这样;模拟对象是A的“真实”实例的包装,并且定义的期望在到达该实例之前拦截了该方法调用。 (其他未定义期望的方法,例如b,会在不受影响的情况下转发,尽管它们仍会通过模拟传递。)

当实例在内部进行方法调用时,它们直接进入self,而不是通过模拟包装返回,因此它们被正常分派,没有被拦截的机会。


答案 1 :(得分:0)

找到了一个很棒的宝石,可以很好地解决这个问题:

https://github.com/bogdanvlviv/minitest-mock_expectations

assert_called a, :c do
  a.b
end