Minitest - вызов метода ложного экземпляра из другого метода экземпляра - PullRequest
0 голосов
/ 01 июля 2018

Я столкнулся с каким-то странным поведением в 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 голосов
/ 19 ноября 2018

Нашел удивительный драгоценный камень, который прекрасно это решает:

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

assert_called a, :c do
  a.b
end
0 голосов
/ 01 июля 2018

Так работает Minitest::Mock; фиктивный объект является оберткой вокруг «реального» экземпляра A, и определенные ожидания перехватывают вызов метода до того, как он попадет в этот экземпляр. (Другие методы, такие как b, без определения ожиданий, перенаправляются на незатронутые - хотя они все еще проходят через макет.)

Когда экземпляр выполняет внутренние вызовы методов, они переходят непосредственно к self, а не обратно через фиктивную оболочку, поэтому они отправляются нормально, без возможности перехвата.


...