Я нахожу насмешливые вещи с RSpec совершенно проблематичными, и я часто не знаю, сколько кода включить, с точки зрения диагностики. Итак, я начну с ситуации, которая у меня есть, и кода, который я выделил как вызывающий проблему.
У меня есть тесты, в которых мне нужно смоделировать браузер. У меня есть фиктивный драйвер, который я настроил так:
require "watir"
def mock_driver
browser = double("watir")
allow(browser).to receive(:is_a?).with(Watir::Browser).and_return(true)
allow(browser).to receive(:driver).and_return(true)
browser
end
Единственные проблемы, с которыми я столкнулся в моем наборе тестов, - это два теста:
context "an empiric driver is requested" do
it "a watir browser is provided" do
allow(Watir::Browser).to receive(:new).and_return(Empiric.browser)
Empiric.set_browser mock_driver
end
it "the requested watir browser can be shut down" do
#allow(Empiric.browser).to receive(:quit)
Empiric.quit_browser
#allow(mock_browser).to receive(:new).and_return(Empiric.browser)
#Empiric.set_browser mock_driver
end
end
(закомментированные биты вВторой тест специально предназначен для иллюстрации происходящего.)
С этой строкой во втором тесте я получаю следующую ошибку в этом тесте:
<Double "watir"> was originally created in one example but has leaked into another
example and can no longer be used. rspec-mocks' doubles are designed to only last for
one example, and you need to create a new one in each example you wish to use it for.
Если я полностьюзакомментируйте первый тест, приведенный выше, этой ошибки не происходит, поэтому я знаю, что выделил два теста, которые взаимодействуют друг с другом.
Хорошо, теперь обратите внимание на последнюю строкумой второй тест, который закомментирован. Это кажется тем, что указывает мне ошибка. Он говорит, что мне нужно создать новый дубль в другом. Итак, я изменю свой последний тест:
it "the requested watir browser can be shut down" do
#allow(Empiric.browser).to receive(:quit)
Empiric.quit_browser
#allow(mock_browser).to receive(:new).and_return(Empiric.browser)
Empiric.set_browser mock_driver
end
Итак, здесь я раскомментировал последнюю строку, поэтому я устанавливаю mock_driver
в этом тесте и не допускаю утечки кода.
Это, однако, возвращает точно такую же ошибку в том же тесте.
Я не уверен, поможет ли это увидеть методы, которые вызываются в этом тесте, но здесь онинаходятся. Во-первых, set_browser
:
def set_browser(app = :chrome, *args)
@browser = Watir::Browser.new(app, *args)
Empiric.browser = @browser
end
А вот quit_browser
:
def quit_browser
@browser.quit
end
Тот факт, что RSpec считал, что один тест «просачивается» в другой, заставил меня подумать, что, возможно,Мой @browser
экземпляр был проблемой, в сущности состоящей в том, что сохраняется между двумя тестами. Но я не вижу, как обойти это. Я подумал, что, может быть, если я выйду из браузера в первом тесте, это поможет. Поэтому я изменил первый тест следующим образом:
it "a watir browser is provided" do
Empiric.quit_browser
allow(Watir::Browser).to receive(:new).and_return(Empiric.browser)
Empiric.start_browser mock_driver
end
Это, однако, привело к тому, что вышеупомянутая ошибка теперь отображается в обоих тестах. Я предполагаю, что я просто не знаю, как в этом контексте дать имитацию.