Проверка интеграции Rails 5 завершается неудачно с NoMethodError: неопределенный метод `[] = 'для nil: NilClass при использовании помощника Devise sign_in - PullRequest
0 голосов
/ 04 марта 2019

Я пишу интеграционный тест для Rails v5.1 с использованием встроенного Minitest.

Вот класс интеграционного теста:

require 'test_helper'

class PuppiesEndpointsTest < ActionDispatch::IntegrationTest

    include Devise::Test::IntegrationHelpers

    test "DELETE puppy" do
        marty = people(:marty)

        sign_in(marty)

        # delete puppies_delete_path(marty.puppies.first.id)
        # delete `/api/v1/puppies/destroy/${marty.puppies.first.id}.json`
        # delete puppies_path(marty.puppies.first.id)
        delete '/api/v1/puppies/destroy/6666.json'
        assert_response :success
    end

end

Все вышеперечисленные маршруты, включаяте, которые закомментированы, приводят к той же загадочной ошибке:

Error:
PuppiesEndpointsTest#test_DELETE_puppy:
NoMethodError: undefined method `[]=' for nil:NilClass
    test/integration/puppies_endpoints_test.rb:17:in `block in <class:PuppiesEndpointsTest>'


bin/rails test test/integration/puppies_endpoints_test.rb:7

Это не дает трассировки стека или любой другой информации, чтобы диагностировать, о чем, черт возьми, идет речь.Я использовал byebug для отладки переменной marty прямо перед строкой delete, которая выдает ошибку.Он показывает ожидаемый массив щенков связанных (фиксированных) записей.

Я также поместил байга в самый верх действия контроллера, и эта ошибка не проходит тест, пока не достигнет этого байга, поэтому я думаю, что в коде действия практически ничего не исключено.

Вот соответствующий фрагмент того, что я вижу при запуске rake routes:

                       PATCH      /api/v1/puppies/edit/:id(.:format)        puppies#update
                       DELETE     /api/v1/puppies/destroy/:id(.:format)     puppies#destroy
        puppies_create POST       /api/v1/puppies/create(.:format)          puppies#create

Вот что на самом деле находится в моем файле маршрутов:

  scope '/api' do
    scope '/v1' do
      devise_for :people

      patch 'puppies/edit/:id' => 'puppies#update'
      delete 'puppies/destroy/:id' => 'puppies#destroy'#, as: 'puppies_delete'
      post 'puppies/create' => 'puppies#create'
      ...

Я полностьюозадачен тем, что / почему я получаю эту ошибку.Фактический код работает полностью, как и ожидалось.

Я догадываюсь, что, возможно, отсутствует недостающая переменная конфигурации, которая не устанавливается для тестовой среды (я использую гем dotenv), но я не знаю, как отследить этоесли ошибка не даст мне никакого контекста.

ОБНОВЛЕНИЕ

Я выделил эту проблему с помощью вспомогательного метода Devise sign_in.Когда я удаляю этот вызов метода, проблема исчезает.

Вот проблемный тестовый класс:

require 'test_helper'

class PuppiesEndpointsTest < ActionDispatch::IntegrationTest

    include Devise::Test::IntegrationHelpers

    test "do stuff" do
       ...

app / controllers / api_controller.rb:

class ApiController < ActionController::API
end

Возможно sign_in не работает для тестирования контроллеров, которые не наследуются от ActionController :: Base

Я изменил контроллер для наследования от ActionController::Base и ничего не изменилось.Я до сих пор не могу использовать sign_in без получения этой ошибки, но это работает, если я "вручную" post запрос к конечной точке sign_in.

UPDATE 2 Я нашел этоПридумайте проблему, которая звучит как моя проблема: https://github.com/plataformatec/devise/issues/2065

1 Ответ

0 голосов
/ 06 марта 2019

Похоже, я нашел проблему .По-видимому, в режиме rails-api промежуточные программы ActionDispatch :: Cookies и ActionDispatch :: Session :: CookieStore вставляются в конец стека промежуточного программного обеспечения, что не происходит в обычном режиме Rails.

Из-заэто, эти промежуточные программы включены после Warden :: Manager, который что-то напутает в спецификации запроса.

Попробуйте установить в test.rb

Rails.application.config.middleware.insert_before Warden::Manager, ActionDispatch::Cookies
Rails.application.config.middleware.insert_before Warden::Manager, ActionDispatch::Session::CookieStore
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...