未定义方法'env',空值:NilClass

16

这是我的规格文件的样子:spec/api/v1/projects_spec.rb

require "spec_helper"

describe "/api/v1/projects", :type => :api do
  context "projects viewable by this user" do
   it "JSON" do
   end
  end
end

这段代码包含更多内容,但我在试图查找错误时删除了很多行,错误如下:

Failure/Error: Unable to find matching line from backtrace
NoMethodError: undefined method `env' for nil:NilClass

这段代码来自 Ryan Bigg 的 "Rails 3 in Action"。它只包含另一个文件:spec/support/api/helper.rb

module ApiHelper
  include Rack::Test::Methods

  def app
   Rails.application
  end
end

RSpec.configure do |c|
  c.include ApiHelper, :type => :api
end

我已经尝试谷歌搜索这个错误1小时了,最接近的事情是这个,然后我删除了使用Devise::Test_Helpers的代码。可悲的是,它仍然无法正常工作。

任何帮助都将不胜感激。非常感谢。

堆栈跟踪

 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/devise-2.0.4/lib/devise/test_helpers.rb:24:in `setup_controller_for_warden'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-rails-2.8.1/lib/rspec/rails/adapters.rb:15:in `block (2 levels) in setup'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:35:in `instance_eval'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:35:in `run_in'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `block in run_all'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `each'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `run_all'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:368:in `run_hook'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `block in run_before_each_hooks'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `each'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `run_before_each_hooks'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example.rb:217:in `run_before_each'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example.rb:79:in `block in run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example.rb:173:in `with_around_hooks'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example.rb:77:in `run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:355:in `block in run_examples'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:351:in `map'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:351:in `run_examples'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:337:in `run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `block in run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `map'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `map'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `block in run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/reporter.rb:34:in `report'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:25:in `run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:80:in `run_in_process'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:69:in `run'
 # /home/prakhar/.rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:10:in `block in autorun'

加入更多的堆栈跟踪信息会更有帮助。 - jdl
顺便提一下,如果你想在Capybara中使用Devise,请参见此答案。 - Sheharyar
2个回答

22

你仍然在某个地方包含了Devise::TestHelpers。检查一下"spec_helper"正在加载什么。


1
是的。Spec_Helper正在调用Devise :: TestHelpers。在编写我的测试时,我应该如何解决这个问题? - Prakhar
4
只需要在使用它们的规范中包含 Devise::TestHelpers 即可,不必全局包含所有规范。例如,在测试文件 some_controller_spec.rb 中调用 include Devise::TestHelpers,不要改动 spec_helper.rb - Mark Sands
4
你还需要进行一些其他的设置,以保持测试的DRY性,因此我创建了一个专门针对Devise的ActionController::TestCase子类。https://gist.github.com/mahemoff/8651382 - mahemoff

4

除了包含Devise测试助手之外,您还可以指定它的类型,以便在路由规范中不包含它:

  config.include Devise::TestHelpers, :type => :helper
  config.include Devise::TestHelpers, :type => :controller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接