Я провожу тестирование контроллеров с помощью RSpec и Mocha. Вот пример
describe MenuItemsController, "creating a new menu item" do
integrate_views
fixtures :menu_items
it "should redirect to index with a notice on successful save" do
MenuItem.any_instance.stubs(:valid?).returns(true)
post 'create'
assigns[:menu_item].should_not be_new_record
flash[:notice].should_not be_nil
response.should redirect_to(menu_items_path)
end
end
У меня есть несколько вопросов по этому примеру
Где документация по методу post (и другим командам REST)?
Как объект, созданный
MenuItem.any_instance.stubs (: действителен?). Возвращает (истина)
перейти к действию контроллера?
Чем вопрос 2 отличается от прямой передачи параметров контроллеру с помощью метода post?
2 ответа
1 .
Для публикации
Для Get
Для поместите
Для Удалить
2 .
Это действительно не прошло. Вы настраиваете свой тестовый пример так, чтобы учитывая, что вызов valid? выполняется экземпляром MenuItem. Тогда будет использоваться ваша заглушка, и результат этой проверки действителен? будет истинным. Вы решаете, что будет возвращено этим допустимым? вызовом.
3 .
Когда вы вставляете заглушку при запуске теста, вместо нормального выполнения кода, для этого конкретного действительного? экземпляра MenuItem; ваш код не будет пытаться определить, действителен ваш menuItem или нет. Он просто вернет значение, которое вы указали в своих заглушках. В вашем случае правда
Таким образом, здесь вы не проверяете, что ваш экземпляр MenuItem возвращает true с заданным правильным параметром, но вы проверяете, что происходит, когда ваш экземпляр MenuItem возвращает true.
Это может быть не очень полезно для вас здесь, если вы можете легко настроить сообщение с параметром, который всегда будет приводить к valid? == true
для вашего элемента MenuInstance.
Но, например, когда у вас есть фрагмент кода, который подключается к WebService, вы можете использовать заглушку, которая возвращает Connection Unavailable , чтобы проверить, что происходит в вашем коде, когда Webservice не работает.
Вы можете найти документацию по тестовым методам REST в документации Rails
Объект не передается контроллеру, он создается контроллером.
MenuItem.any_instance.stubs(:valid?).return(true)
гарантирует, что любой экземплярMenuItem
, созданный в контексте ваших спецификаций, вернетtrue
для методаvalid?
.Основная цель исключения методов - изолировать то, что вы тестируете. Если вы передадите свои параметры контроллеру вместо того, чтобы вырезать только те методы, которые вам нужны для тестирования вашего контроллера, вы теперь тестируете свой контроллер и свою модель. Поскольку у вас, вероятно, есть спецификации ваших моделей в другом месте, дублирование служит только для того, чтобы сделать ваши спецификации более сложными и хрупкими.
Заглушка метода
valid?
для возвратаtrue
- это вариант с меньшими затратами на обслуживание по сравнению с передачей всех параметров, необходимых для того, чтобы ваша модель возвращалаtrue
самостоятельно.
Похожие вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.