Я хотел бы протестировать контроллеры в Rails 5, для которых активирована базовая аутентификация.Способ, описанный в действующей официальной инструкции (по состоянию на 2018-10-14), почему-то не работает.Вопрос-ответ " Проверка базовой HTTP-аутентификации в Rails 2.2 + " кажется слишком старым для Rails 5 (по крайней мере, по умолчанию).
Вот упрощенный пример для воспроизведения случая.
Я создал модель Article и связанные ресурсы с помощью scaffold из новой установки Rails (последняя стабильная версия 5.2.1):
bin/rails g scaffold Article title:string content:text
и добавил базовую функцию аутентификации в контроллер, следуя официальное руководство ;тогда ArticlesController работает следующим образом:
# /app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
http_basic_authenticate_with name: "user1", password: "pass"
before_action :set_article, only: [:show, :edit, :update, :destroy]
def index
@articles = Article.all
end
end
Официальная инструкция объясняет способ проверки базовой аутентификации;Вы добавляете request.headers['Authorization']
в блок setup
в тестовом файле контроллера, что я и сделал:
# /test/controllers/articles_controller_test.rb
require 'test_helper'
class ArticlesControllerTest < ActionDispatch::IntegrationTest
setup do
request.headers['Authorization'] =
ActionController::HttpAuthentication::Basic.encode_credentials("user1", "pass")
@article = articles(:one)
end
test "should get index" do
get articles_url
assert_response :success
end
end
Однако bin/rails test
завершается неудачно следующим образом:
# Running:
E
Error:
ArticlesControllerTest#test_should_get_index:
NoMethodError: undefined method `headers' for nil:NilClass
test/controllers/articles_controller_test.rb:5:in `block in <class:ArticlesControllerTest>'
bin/rails test test/controllers/articles_controller_test.rb:10
Ясно, что метод request
возвращает nil, и, следовательно, request.headers['Authorization']
завершается ошибкой.Это то же самое, если вместо этого оператор находится в верхней части блока 'testing-index'.
Я обнаружил, что request
возвращает правильное значение после запуска get articles_url
,но уже слишком поздно;Я имею в виду, аутентификация уже провалилась к тому времени (очевидно).При некотором поиске, кажется, некоторые люди вместо этого используют @request
и @response
для этой цели, но я также обнаружил, что они точно в той же ситуации, что и request
(ожидаемо?), То есть они равны нулю раньшеget
.
Как обходить или проверять Basic Auth при тестировании контроллеров или интеграционных тестах в Rails 5?
РЕДАКТИРОВАТЬ:
"The текущее официальное указание (по состоянию на 2018-10-14) "явно неверно.См ответ .