У меня есть класс A
с методом M
, для которого я хочу написать тест T
. Проблема в том, что метод M
создает новый объект O
. Я хочу издеваться над методом F
этого нового объекта O
.
class A
def M(p1, p2)
@o = O.new(p1, p2)
end
end
class O
def F(q)
...
end
end
Я могу очень легко сделать это с помощью функции allow_any_instance_of
в RSpec, но я действительно не вижу способа сделать это только с помощью allow
или expect
. Я понимаю, что могу имитировать метод существующего экземпляра и класса, но из моих тестов я не смог заставить его работать с методами объектов, которые создаются в методе, который я тестирую.
T :process do
it "works" do
# This works
allow_any_instance_of(O).to receive(:F).and_return(123)
...
end
it "does not works" do
# This fails
allow(O).to receive(:F).and_return(123)
...
end
end
Как я узнаю, что это не удается?
Я изменил свой метод F
на puts()
и вижу результат на экране, когда использую allow(O)
. Он вообще не появляется, когда я использую allow_any_instance_of()
. Поэтому я знаю, что он работает так, как ожидалось, только в последнем.
def F(q)
puts("If I see this, then F() was not mocked properly.")
...
end
Я бы подумал, что allow(O)...
должен подключаться к классу, поэтому всякий раз, когда создается новый экземпляр, следуют имитированные функции, но, по-видимому, нет.
Есть ли у вас тесты RSpec, обрабатывающие такие случаи насмешек по-другому, без использования функции allow_any_instance_of()
?
Я спрашиваю, потому что это помечен как устаревший (@allow-old-syntax
) начиная с RSpec 3.3, поэтому похоже, что мы больше не должны использовать эту функцию, особенно когда выйдет RSpec 4.x, она, вероятно, исчезнет.