Spec-Zone.ru › Ruby on Rails 7.1

class ActionController::TestCase

Parent:
ActiveSupport::TestCase
Included modules:
ActionController::TestCase::Behavior

Тест-кейс контроллера Action Controller

Базовый класс для функциональных тестов ActionController. Функциональные тесты позволяют тестировать один контроллер за один метод.

Используйте интеграционные тесты контроллера вместо функциональных.

В Rails не рекомендуется использовать функциональные тесты в пользу интеграционных (используйте ActionDispatch::IntegrationTest).

Новые приложения Rails больше не генерируют функциональные тесты контроллеров, и их следует использовать только для обратной совместимости. Интеграционные тесты контроллеров выполняют фактические запросы, тогда как функциональные тесты контроллеров просто имитируют запрос. Кроме того, интеграционные тесты так же быстры, как функциональные тесты, и предоставляют множество вспомогательных функций, таких как as, parsed_body для эффективного тестирования действий контроллеров, включая даже API конечные точки.

Базовый пример

Функциональные тесты пишутся следующим образом:

  1. Сначала используется метод get, post, patch, put, delete, или head для имитации HTTP-запроса.

  2. Затем проверяется, соответствует ли текущее состояние ожидаемому. «Состояние» может быть чем угодно: 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

Тестирование внутренних компонентов контроллера

В дополнение к этим конкретным проверкам, у вас также есть лёгкий доступ к различным коллекциям, для которых могут быть использованы обычные проверки test/unit. Эти коллекции:

  • session: Объекты, сохраненные в сессии.

  • 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, по которому перенаправлено данное действие, доступный в redirect_to_url.

Для перенаправлений в рамках одного контроллера вы даже можете вызвать follow_redirect, и перенаправление будет выполнено, вызвав другую функцию, которая затем может быть проверена.

Изменение переменных сессии и куки

Иногда вам необходимо настроить переменные сессии и куки для теста. Для этого просто присвойте значение коллекции сессии или куки:

session[:key] = "value"
cookies[:key] = "value"

Для очистки куки для теста просто очистите коллекцию куки:

cookies.clear

Тестирование именованных маршрутов

Если вы используете именованные маршруты, их можно легко протестировать, используя исходные методы именованных маршрутов прямо в тесте.

assert_redirected_to page_url(title: 'foo')

Атрибуты

executor_around_each_request[RW]

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API