Сообщение: сбой / ошибка: требуется File.expand_path ('../../ config / environment', __FILE__) - PullRequest
0 голосов
/ 19 октября 2018

Сначала я прочитал другие посты пользователей с похожими проблемами, но не смог прийти туда, где моя ошибка.Я хотел запустить тест с RSpec для следующего файла:

dashboard_view_spec.rb:

require 'rails_helper'

RSpec.feature "Dashboard", type: :feature do 
before(:each) do
@current_user = User.create!(email: "xyz@xyz.com", password: "xyz123")
sign_in_with(@current_user.email,@current_user.password)
end

#NAV BAR RSPEC TEST
scenario 'Home bar nav link present' do
visit "/"
expect(page).to have_text('Home')
end

scenario 'How it work nav bar link present' do
visit "/"
expect(page).to have_text('How it work')
end

scenario 'Support nav bar link present' do
visit "/"
expect(page).to have_text('Support')
end

end

На rails_helper.rb вверху:

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV['RAILS_ENV'] ||= 'test'

require File.expand_path('../../config/environment', __FILE__)
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if   Rails.env.production?

require 'rake'
require 'spec_helper'
require 'rspec/rails'
require 'shoulda/matchers'
require 'capybara/rails'
require 'capybara/rspec'
require 'rspec/retry'
require 'devise'

Ошибкасообщение:

Failure/Error: require File.expand_path('../../config/environment', __FILE__)

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)>'
No examples found.

Randomized with seed 14549

Затем команда, которую я использовал на терминале

 bundle exec rspec spec/views/dashboard_view_spec.rb

После просмотра документации по тестированию с Devise я изменил код в dashboard_view_spec.rb и sign_in используется как пользователь и получает то же сообщение об ошибке.

Строка 258 devise.rb

 config.omniauth :facebook, Rails.application.secrets.facebook[:key],  Rails.application.secrets.facebook[:secret], scope: 'email', info_fields: 'email, name'

В файле gemfile

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger     console
 gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
 # Adds support for Capybara system testing and selenium driver
 gem 'capybara', '~> 2.13'
 gem 'selenium-webdriver'
 gem 'rspec-rails', '~> 3.8'
 gem 'factory_girl_rails'
 gem 'faker'
 gem 'database_cleaner'
end

и

group :development do
# Access an IRB console on exception pages or by using <%= console %>    anywhere in the code.
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
# Spring speeds up development by keeping your application running in the  background. Read more: https://github.com/rails/spring
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end

Ответы [ 2 ]

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

Просто получил ту же ошибку, но когда я запустил bundle exec rake spec вместо bundle exec rspec, это сработало.

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

Проблема в том, что вы пропустили переменную, которую ожидает найти ваш инициализатор 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. (при условии, что других ошибок или недостающих секретов нет))

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