Я пишу интеграционный тест для 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