Я провожу тестирование контроллеров с помощью 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

У меня есть несколько вопросов по этому примеру

  1. Где документация по методу post (и другим командам REST)?

  2. Как объект, созданный

    MenuItem.any_instance.stubs (: действителен?). Возвращает (истина)

    перейти к действию контроллера?

  3. Чем вопрос 2 отличается от прямой передачи параметров контроллеру с помощью метода post?

1
stellard 5 Ноя 2009 в 00:04

2 ответа

Лучший ответ

1 .

Для публикации

Для Get

Для поместите

Для Удалить

2 .

Это действительно не прошло. Вы настраиваете свой тестовый пример так, чтобы учитывая, что вызов valid? выполняется экземпляром MenuItem. Тогда будет использоваться ваша заглушка, и результат этой проверки действителен? будет истинным. Вы решаете, что будет возвращено этим допустимым? вызовом.

3 .

Когда вы вставляете заглушку при запуске теста, вместо нормального выполнения кода, для этого конкретного действительного? экземпляра MenuItem; ваш код не будет пытаться определить, действителен ваш menuItem или нет. Он просто вернет значение, которое вы указали в своих заглушках. В вашем случае правда

Таким образом, здесь вы не проверяете, что ваш экземпляр MenuItem возвращает true с заданным правильным параметром, но вы проверяете, что происходит, когда ваш экземпляр MenuItem возвращает true.

Это может быть не очень полезно для вас здесь, если вы можете легко настроить сообщение с параметром, который всегда будет приводить к valid? == true для вашего элемента MenuInstance.

Но, например, когда у вас есть фрагмент кода, который подключается к WebService, вы можете использовать заглушку, которая возвращает Connection Unavailable , чтобы проверить, что происходит в вашем коде, когда Webservice не работает.

0
Aurélien Bottazini 5 Ноя 2009 в 02:36
2
Ссылки на документацию больше не действительны.
 – 
aardvarkk
24 Окт 2013 в 05:24
  1. Вы можете найти документацию по тестовым методам REST в документации Rails

  2. Объект не передается контроллеру, он создается контроллером. MenuItem.any_instance.stubs(:valid?).return(true) гарантирует, что любой экземпляр MenuItem, созданный в контексте ваших спецификаций, вернет true для метода valid?.

  3. Основная цель исключения методов - изолировать то, что вы тестируете. Если вы передадите свои параметры контроллеру вместо того, чтобы вырезать только те методы, которые вам нужны для тестирования вашего контроллера, вы теперь тестируете свой контроллер и свою модель. Поскольку у вас, вероятно, есть спецификации ваших моделей в другом месте, дублирование служит только для того, чтобы сделать ваши спецификации более сложными и хрупкими.

    Заглушка метода valid? для возврата true - это вариант с меньшими затратами на обслуживание по сравнению с передачей всех параметров, необходимых для того, чтобы ваша модель возвращала true самостоятельно.

0
Community 20 Июн 2020 в 12:12
Ссылка на документацию больше не действительна.
 – 
aardvarkk
24 Окт 2013 в 05:24