класс ActionController::TestCase
Базовый класс для функциональных тестов ActionController. Функциональные тесты позволяют вам тестировать один контроллер за один метод.
Используйте контроллеры интеграционного стиля вместо функциональных.
Rails не рекомендует использовать функциональные тесты в пользу интеграционных (используйте ActionDispatch::IntegrationTest).
Новые приложения Rails больше не генерируют функциональные тесты контроллеров, и они должны использоваться только для обратной совместимости. Контроллеры интеграционного стиля выполняют реальные запросы, в то время как функциональные тесты контроллеров просто имитируют запрос. Кроме того, интеграционные тесты так же быстры, как и функциональные, и предоставляют множество вспомогательных функций, таких как as, parsed_body для эффективного тестирования действий контроллера, включая даже API конечные точки.
Базовый пример
Функциональные тесты записываются следующим образом:
-
Сначала используется метод
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, params: { book: { title: "Love Hina" }})
# Asserts that the controller tried to redirect us to
# the created book's URI.
assert_response :found
# Asserts 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, body: json
end
Специальные переменные экземпляра
ActionController::TestCase также автоматически предоставит следующие переменные экземпляра для использования в тестах:
- @controller
-
Экземпляр контроллера, который будет протестирован.
- @request
-
ActionController::TestRequest, представляющий текущий HTTP-запрос. Вы можете изменить этот объект перед отправкой HTTP-запроса. Например, вы можете установить некоторые свойства сеанса перед отправкой запроса GET.
- @response
-
Объект
ActionDispatch::TestResponse, представляющий ответ последнего HTTP-запроса. В приведенном выше примере@responseстановится допустимым после вызоваpost. Если различных методов проверки недостаточно, вы можете использовать этот объект для подробного анализа HTTP-ответа.
Контроллер автоматически определяется
ActionController::TestCase автоматически определит контроллер, подлежащий тестированию, по имени класса теста. Если контроллер не может быть определен по имени класса теста, вы можете явно установить его с помощью tests.
class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase tests WidgetController end
Тестирование внутренних частей контроллера
В дополнение к этим конкретным проверкам вы также имеете легкий доступ к различным коллекциям, на которых могут быть использованы обычные проверки / юнит-тестов. Эти коллекции:
-
session: Объекты, сохраненные в сеансе.
-
flash: Объекты flash, в настоящее время в сеансе.
-
cookies: Куки, отправленные пользователю в этом запросе.
Эти коллекции могут быть использованы как любой другой хэш:
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
Помимо коллекций, вы можете получить полный URL, на который перенаправил определённый action, в redirect_to_url.
Для перенаправлений внутри одного контроллера вы даже можете вызвать follow_redirect, и перенаправление будет выполнено, вызвав другой action, на котором можно выполнить проверку.
Изменение переменных сеанса и куки
Иногда вам нужно настроить переменные сеанса и куки для теста. Для этого просто присвойте значение коллекции сеанса или куки:
session[:key] = "value" cookies[:key] = "value"
Чтобы очистить куки для теста, просто очистите коллекцию куки:
cookies.clear
Тестирование именованных маршрутов
Если вы используете именованные маршруты, их можно легко протестировать, используя методы оригинальных именованных маршрутов непосредственно в тестовом случае.
assert_redirected_to page_url(title: 'foo')
Атрибуты
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.