Если ваш вопрос о том, почему насмехаться и заглушить, тогда нет короткого ответа. Эти задачи значительно упрощают тестирование, поскольку позволяют лучше контролировать поведение вашего программного обеспечения во время тестирования. Таким образом, тесты становятся быстрее, проще и более «унитарными».
Например, в действии create
в вашем контроллере вы можете проверить его поведение при сохранении модели. Если вы не стучите, вам нужно создать два разных экземпляра; тот, который действителен, а другой - нет.
it "redirects to message with a notice on successful save" do
message_params = FactoryGirl.attributes_for(:message)
post :create, message_params
flash[:notice].should_not be_nil
response.should redirect_to(Message.last)
end
it "renders a :new template with a notice on unsuccessful save" do
message_params = FactoryGirl.attributes_for(:message, name: nil)
post :create, message_params
flash[:notice].should_not be_nil
response.should render_template :new
end
Как вы можете видеть, это было необходимо создать два экземпляра Message
; один действительный и один недопустимый. Для их создания мы использовали FactoryGirl. Другими словами, тест не является полностью унитарным, поскольку другие вещи могут ошибиться в создании экземпляров. Мы действительно хотим проверить: перенаправляет ли она на страницу X, если сохранение было успешным? Поэтому мы просто хотим убедиться, что @message.valid?
возвращает true
в одном случае и false
в другом случае. Это можно легко сделать с помощью заглушки:
it "should redirect to message with a notice on successful save" do
Message.any_instance.stubs(:valid?).returns(true)
post 'create'
flash[:notice].should_not be_nil
response.should redirect_to(Batch.last)
end
it "should render new template with a notice on unsuccessful save" do
Message.any_instance.stubs(:valid?).returns(false)
post 'create'
flash[:notice].should be_nil
response.should render_template('new')
end
Таким образом, в этом случае испытания, которые так намного легче, так как мы не должны создавать экземпляры объектов, мы просто окурок метод, чтобы вернуть то, что мы хочу, чтобы он вернулся. Есть много других причин для его использования, и вы можете узнать больше о насмехании и обучении.
Однако, если у вас есть вопросы, чтобы использовать встроенные в насмехающиеся и стробирующие функции Rspec или использовать внешние драгоценные камни, такие как Mocha, тогда ответ короче: сегодня я считаю, что это больше касается личных предпочтений. Раньше в таких структурах, как Mocha, были функции, которых Rspec не имел, например, метод any_instance
, использованный выше. Но Rspec развился, и сегодня он так же хорош, как и другие.
Благодарим вас за подробный ответ. Я имел в виду по обоим вопросам, поэтому спасибо, что нашли время ответить на них обоих. Ответ хороший, и это очень полезно. благодаря – Aleks