Я пытаюсь понять тесты в унаследованном приложении, и мне нужна помощь.Rspec mocks, может 'ожидать' также заглушить метод как побочный эффект?
Есть много спецификации таких групп, как это один (вид спецификации):
let(:job_post) { FactoryGirl.create(:job_post) }
# ...
before do
expect(view).to receive(:job_post).at_least(:once).and_return(job_post)
end
it "should render without error" do
render
end
... с job_post
будучи вспомогательный метод, определенный на контроллере. (да, они могли использовать переменные @instance, и я в процессе рефакторинга).
Теперь, на мой взгляд, использование expect
внутри блока before
неверно. Давайте забудем об этом на секунду.
Обычно тест выше зеленый.
Однако, если я удаляю линии expect
, тест не проходит. Похоже, что в этом случае expect
укутывает метод на вид. Фактически, замена expect
на allow
, похоже, имеет тот же эффект.
Я думаю, что то, что происходит в том, что обычно - при запуске с сервером - вид будет вызывать job_posts
и сообщение будет земля на вспомогательном методе на контроллере, который является ожидаемым поведением.
Здесь, однако, expect
устанавливает ожидаемое значение и в то же время накладывает метод на view
с фиксированным возвращаемым значением. Так как шаблон вида будет, вызовите этот метод, тест пройдет.
О том, что неожиданный «заглушке» побочный эффект expect
, я нашел это в rspec-mocks readme:
(...) Мы можем также установить сообщение ожидания, так что пример не работает, если находка не называется:
person = double("person") expect(Person).to receive(:find) { person }
RSpec заменяет метод мы заглушек или насмешки со своим собственным тест-двойной как метод. В конце примера RSpec проверяет ожидания сообщений, а затем восстанавливает исходные методы.
Есть ли у кого-нибудь опыт в этом конкретном использовании метода?
спасибо. Когда я упоминал переменные экземпляра, я фактически говорил о контроллерах, а не о тестах. Кто работал над передо мной проектом, имел отвращение к представлениям с использованием переменных @instance контроллеров и создал для них все аксессоры. – tompave
Кроме того, большой ответ ... но не могли бы вы расшириться на 'should_receive'? Я всегда использовал 'stub' и' allow', и я всегда предполагал, что 'expect (obj) .to receive' задает математическое ожидание __only__. – tompave
Спасибо за разъяснение. Да, я знаю о важности макетов и заглушек в модульных тестах. Тем не менее, я всегда явно использовал 'stub/allow' для заглушения метода, а затем' shout_receive/expect(). Получать 'для проверки сообщения. Я был просто удивлен, что 'expect' обрабатывает его автоматически ... и я считаю это немного запутанным, если честно. – tompave