Проблема в том, что вы пропустили переменную, которую ожидает найти ваш инициализатор devise, но пропустили ее только в среде test
.(не в среде development
)
Предоставленная трассировка стека и строка 258 из config/initializers/devise.rb
- все, что нужно.Сначала давайте посмотрим на трассировку стека:
NoMethodError:
undefined method `[]' for nil:NilClass
# ./config/initializers/devise.rb:258:in `block in <top (required)>'
# ./config/initializers/devise.rb:5:in `<top (required)>'
# ./config/environment.rb:5:in `<top (required)>'
# ./spec/rails_helper.rb:4:in `require'
# ./spec/rails_helper.rb:4:in `<top (required)>'
# ./spec/views/dashboard_view_spec.rb:1:in `require'
# ./spec/views/dashboard_view_spec.rb:1:in `<top (required)>'
Начиная снизу вверх, мы видим, что первая строка вашей спецификации является причиной проблемы.Если вы проследите за стеком, то увидите, что он заканчивается config/initializers/devise.rb:258
и жалуется, что что-то, вызывающее метод []
, не получает взамен ожидаемый тип объекта, а вместо этого получает nil
взамен.
Глядя на строку 258, вы обнаружите:
config.omniauth :facebook, Rails.application.secrets.facebook[:key], Rails.application.secrets.facebook[:secret], scope: 'email', info_fields: 'email, name'
Таким образом, вы можете видеть, что есть два раза, что []
называется:
Rails.application.secrets.facebook[:key]
Rails.application.secrets.facebook[:secret]
Что ожидаетсяявляется то, что вызов Rails.application.secrets.facebook
вернет объект Enumerable
(например, массив или хеш), но вместо этого он возвращает nil
, и когда он пытается запустить nil[:key]
или nil[:secret]
, он вызывает исключение, потому что NilClass
не является Enumerable
и не имеет метода []
.Вы можете проверить это самостоятельно в rails console
:
nil[:secret]
=> NoMethodError: undefined method `[]' for nil:NilClass
Решение состоит в том, чтобы гарантировать, что вызов Rails.application.secrets.facebook
возвращает ожидаемый тип объекта.Краткий ответ: отредактируйте config/secrets.yml
, чтобы обеспечить наличие значений, требуемых для среды test
.
Я давно не работал с devise, но я предполагаю, что вы можете безопасноиспользуйте те же значения, которые вы используете для среды development
для среды test
.Вы можете узнать больше о secrets()
в другом месте, но базовый шаблон для config/secrets.yml
выглядит следующим образом:
environment:
key: value
Например:
test:
my_secret_key: my_secret_value
Itдолжно быть довольно просто скопировать и вставить недостающие секреты facebook
в среду test
.После внесения изменений вы можете убедиться, что это сработало:
$ RAILS_ENV=test rails console
Rails.application.secrets.facebook[:key]
=> <your key here>
Если это сработало, запустите вашу спецификацию с rspec
, и она должна успешно пройти строку 1. (при условии, что других ошибок или недостающих секретов нет))