class ActionController::TestCase
Базовый класс для функциональных тестов ActionController. Функциональные тесты позволяют тестировать отдельный контроллер за один метод теста. Это не следует путать с интеграционными тестами (см. ActionDispatch::IntegrationTest), которые больше похожи на «истории», которые могут включать несколько контроллеров и несколько действий (т.е. несколько различных HTTP-запросов).
Базовый пример
Функциональные тесты пишутся следующим образом:
-
Сначала используется метод
get,post,patch,put,deleteилиheadдля моделирования HTTP-запроса. -
Затем проверяется, соответствует ли текущее состояние ожидаемому. «Состояние» может быть чем угодно: HTTP-ответом контроллера, содержимым базы данных и т. д.
Например:
class BooksControllerTest < ActionController::TestCase
def test_create
# Simulate a POST response with the given HTTP parameters.
post(:create, book: { title: "Love Hina" })
# Assert that the controller tried to redirect us to
# the created book's URI.
assert_response :found
# Assert that the controller really put the book in the database.
assert_not_nil Book.find_by(title: "Love Hina")
end
end
Вы также можете отправить реальный документ в моделируемом HTTP-запросе.
def test_create
json = {book: { title: "Love Hina" }}.to_json
post :create, json
end
Специальные переменные экземпляра
ActionController::TestCase также автоматически предоставляет следующие переменные экземпляра для использования в тестах:
- @controller
-
Экземпляр контроллера, который будет тестироваться.
- @request
-
ActionController::TestRequest, представляющий текущий HTTP-запрос. Вы можете изменить этот объект перед отправкой HTTP-запроса. Например, вы можете установить некоторые свойства сеанса перед отправкой запроса GET.
- @response
-
Объект ActionController::TestResponse, представляющий ответ последнего HTTP-ответа. В приведенном выше примере
@responseстановится допустимым после вызоваpost. Если различные методы проверки недостаточны, вы можете использовать этот объект для подробного анализа HTTP-ответа.
(В более ранних версиях Rails каждый функциональный тест должен был унаследовать от Test::Unit::TestCase и определить @controller, @request, @response в setup.)
Контроллер автоматически определяется
ActionController::TestCase автоматически определит тестируемый контроллер по имени класса теста. Если контроллер нельзя определить по имени класса теста, вы можете явно установить его с помощью tests.
class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase tests WidgetController end
Тестирование внутренних компонентов контроллера
В дополнение к этим конкретным проверкам у вас также есть легкий доступ к различным коллекциям, для которых можно использовать стандартные проверки/единичные тесты. Эти коллекции:
-
assigns: Переменные экземпляра, присвоенные в действии, которые доступны для представления.
-
session: Объекты, сохраняемые в сеансе.
-
flash: Объекты flash, в настоящее время в сеансе.
-
cookies: Куки, отправляемые пользователю в этом запросе.
Эти коллекции можно использовать как любой другой хэш:
assert_not_nil assigns(:person) # makes sure that a @person instance variable was set assert_equal "Dave", cookies[:name] # makes sure that a cookie called :name was set as "Dave" assert flash.empty? # makes sure that there's nothing in the flash
По историческим причинам хэш assigns использует ключи на основе строк. Поэтому assigns[:person] не сработает, но assigns["person"] сработает. Однако для удовлетворения наших стремлений к символам был разработан альтернативный доступ с использованием вызова метода вместо ссылки по индексу. Поэтому assigns(:person) сработает так же, как assigns["person"], но снова assigns[:person] не сработает.
Помимо коллекций, у вас есть полный URL, по которому данное действие перенаправило, доступный в redirect_to_url.
Для перенаправлений в рамках одного контроллера вы даже можете вызвать follow_redirect, и перенаправление будет выполнено, вызвав другое действие, которое затем можно проверить.
Изменение переменных сеанса и куки
Иногда вам нужно настроить переменные сеанса и куки для теста. Для этого просто присвойте значение коллекции сеанса или куки:
session[:key] = "value" cookies[:key] = "value"
Для очистки куки для теста просто очистите коллекцию куки:
cookies.clear
Тестирование именованных маршрутов
Если вы используете именованные маршруты, их можно легко протестировать, используя оригинальные методы именованных маршрутов непосредственно в классе теста.
assert_redirected_to page_url(title: 'foo')
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.