Как протестировать или обойти Basic Auth в Rails 5 тестирование контроллеров - PullRequest
0 голосов
/ 14 октября 2018

Я хотел бы протестировать контроллеры в 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) "явно неверно.См ответ .

1 Ответ

0 голосов
/ 14 октября 2018

Документы тестирования были неверными , а были обновлены , но еще не выпущены. обновленные документы читаются:

ПРИМЕЧАНИЕ. Если вы выполнили действия, описанные в разделе «Базовая аутентификация», вам потребуется добавить авторизацию в каждый заголовок запроса, чтобы пройти все тесты.:

post articles_url, params: { article: { body: 'Rails is awesome!', title: 'Hello Rails' } }, headers: { Authorization: ActionController::HttpAuthentication::Basic.encode_credentials('dhh', 'secret') }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...