消息:失败/错误:需要File.expand_path('../../ config / environment',__FILE__)

时间:2018-10-19 15:52:34

标签: ruby-on-rails ruby ruby-on-rails-4 rspec

首先,我阅读了其他有类似问题的用户的帖子,但是我的错误所在无法解决。我想对以下文件使用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 中的代码,并以用户的身份登录并获得了同样的错误信息。

devise.rb的258行

 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

3 个答案:

答案 0 :(得分:2)

问题是您缺少设计初始化程序希望找到的变量,但仅在test环境中丢失了该变量。 (不是development环境)

您提供的堆栈跟踪和config/initializers/devise.rb中的第258行都是必需的。首先,让我们看一下堆栈跟踪:

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结尾,并抱怨进行[]方法调用的东西没有得到预期的对象类型,而是得到了{{ 1}}。

查看第258行,您会发现:

nil

因此您可以看到两次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,并在尝试运行{{ 1}}或nil会引发异常,因为nil[:key]不是nil[:secret]并且没有NilClass方法。您可以在Enumerable中自己进行测试:

[]

解决方案是确保调用rails console返回期望的对象类型。简短的答案是编辑nil[:secret] => NoMethodError: undefined method `[]' for nil:NilClass ,以确保存在Rails.application.secrets.facebook环境所需的值。

我已经很长时间没有使用过devise了,但是我假设您可以安全地将config/secrets.yml环境中使用的相同值用于test环境中。您可以在其他地方阅读有关secrets()的更多信息,但是development的基本模板如下:

test

例如:

config/secrets.yml

将丢失的environment: key: value 机密复制并粘贴到test: my_secret_key: my_secret_value 环境中应该非常简单。进行更改后,您可以验证其是否有效:

facebook

如果可行,则使用test运行您的规范,它应该成功超过第1行。(假设没有其他错误或缺少机密)

答案 1 :(得分:1)

我有非常相似的错误。这是我解决的方法

运行rspec --backtrace

这可能会产生大量控制台输出。向右滚动到顶部,然后从顶部开始阅读。它会告诉你问题开始的文件,以及它发生的行。转到那个文件(和那一行),找出缺少什么。

就我而言,它实际上是 credentials.yml 中缺少的变量,但情况会有所不同。就像@anothermh 的出色回答一样,它基本上是在告诉您缺少某些东西,因此您必须弄清楚缺少什么并确保提供它。

答案 2 :(得分:0)

只是遇到了相同的错误,但是当我运行bundle exec rake spec而不是bundle exec rspec时,它起作用了。