rspec集成测试与devise throws NoMethodError错误 [英] rspec integration test with devise throws NoMethodError error
问题描述
我的文件'spec / request / news_controller_spec.rb'看起来像: p>
require'spec_helper'
描述NewsControllerdo
include Devise: :TestHelpers
描述GET / newsdo
before(:each)do
@ request.env [devise.mapping] = Devise.mappings [:user]
@user = Factory.create(:user)
@ user.confirm!
sign_in @user
end
它登录后应显示最新消息屏幕do
page.should have_content(新闻)
end
end
end
如果我运行测试,我会得到:
失败:
1)广告系列GET /新闻作品!
失败/错误:无法从backtrace找到匹配的行
NoMethodError:
未定义的方法env为nil:NilClass
#/Users/.../gems/devise- 1.5.3 / lib / devise / test_helpers.rb:25:在`setup_controller_for_warden'
#/Users/.../gems/rspec-rails-2.8.1/lib/rspec/rails/adapters.rb中: 15:在'block(2级)'在设置'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:35:in`instance_eval'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:35:in`run_in'
#/Users/.../ gems / rspec-core-2.8.0 / lib / rspec / core / hooks.rb:70:在`block in run_all'
#/Users/.../gems/rspec-core-2.8.0/ lib / rspec / core / hooks.rb:70:在`each'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:在`run_all'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:368:in`run_hook'
#/ Users / ... / gems / rspec-core-2.8.0 / lib / rspec / core / example_group.rb:292:在`block in run_bef ore_each_hooks'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in`each'
#/ Users / .. ./gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in`run_before_each_hooks'
#/Users/.../gems/rspec-core-2.8.0/ lib / rspec / core / example.rb:217:在`run_before_each'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:79:在`block in run'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:173:in`with_around_hooks'
#/用户/.../ gems / rspec-core-2.8.0 / lib / rspec / core / example.rb:77:在`run'
#/Users/.../gems/rspec-core- 2.8.0 / lib / rspec / core / example_group.rb:355:在`block in run_examples'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/ example_group.rb:351:在`map'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:351:in`run_examples'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:337:in`run'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in`block in run'
#/Users/.../gems/ rspec-core-2.8.0 / lib / rspec / core / example_group.rb:338:在`map'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/ core / example_group.rb:338:在`run'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in`block 2级)在运行'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in'map'
#/用户/.../ gems / rspec-core-2.8.0 / lib / rspec / core / command_line.rb:28:在`block in run'
#/Users/.../gems/rspec- core-2.8.0 / lib / rspec / core / reporter.rb:34:在`report'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/ command_line.rb:25:在`run'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:80:in`run_in_process'
#/Users/.../gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:69:in`run'
#/Users/.../gems/ rspec的核 - 2.8.0 / LIB / rspec的/型芯/ runne r.rb:10:在`block in autorun'
我按照 https:/ /github.com/plataformatec/devise/wiki/How-To%3a-Controllers-and-Views-tests-with-Rails-3-%28and-rspec%29 和其他类似的问题在这里,但我可以找不到解决方案。
我正在使用以下gemset:
- capybara(1.1.2)
- devise(1.5.3)
- factory_girl_rails(1.6.0)
- (3.2.0,3.1.1)
- rspec(2.8.0)
- rspec-core(2.8.0)
- rspec-expectations(2.8.0)
- rspec-mocks(2.8.0)
- rspec-rails 2.8.1)
和其他一些宝石。
我,通过登录的用户获得我的集成测试。在这种情况下,只有在用户登录时才会显示新闻。
谢谢。
我确实有同样的问题,谷歌搜索后,我发现包含 Warden :: Test :: Helpers
直接是一个更多简单的解决方案要求规格,因为它以编程方式登录/注销用户,就像这样:
#spec / support / request_helpers.rb
require'spec_helper'
include Warden :: Test :: Helpers
module RequestHelpers
def create_logged_in_user
user = Factory(:user)
登录(用户)
用户
结束
def登录(用户)
login_as用户,范围:用户
结束
结束
简而言之,只包括 Warden :: Test :: Helpers
然后使用 login_as< your_user>
方法,就是这样!
从这里取得的解决方案: http://simple10.com/rspec-capybara-devise-login-tests/
I have a similar error posted here, but all will not fix my problem.
My file 'spec/request/news_controller_spec.rb' looks like:
require 'spec_helper'
describe "NewsController" do
include Devise::TestHelpers
describe "GET /news" do
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
@user = Factory.create(:user)
@user.confirm!
sign_in @user
end
it "after login should show the latest news an screen" do
page.should have_content("News")
end
end
end
If I run the test I'll get:
Failures:
1) Campaigns GET /news works!
Failure/Error: Unable to find matching line from backtrace
NoMethodError:
undefined method `env' for nil:NilClass
# /Users/.../gems/devise-1.5.3/lib/devise/test_helpers.rb:25:in `setup_controller_for_warden'
# /Users/.../gems/rspec-rails-2.8.1/lib/rspec/rails/adapters.rb:15:in `block (2 levels) in setup'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:35:in `instance_eval'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:35:in `run_in'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `block in run_all'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `each'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `run_all'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:368:in `run_hook'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `block in run_before_each_hooks'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `each'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `run_before_each_hooks'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:217:in `run_before_each'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:79:in `block in run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:173:in `with_around_hooks'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:77:in `run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:355:in `block in run_examples'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:351:in `map'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:351:in `run_examples'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:337:in `run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `block in run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `map'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `map'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `block in run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/reporter.rb:34:in `report'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:25:in `run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:80:in `run_in_process'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:69:in `run'
# /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:10:in `block in autorun'
I followed instructions on https://github.com/plataformatec/devise/wiki/How-To%3a-Controllers-and-Views-tests-with-Rails-3-%28and-rspec%29 and other similar Questions here, but I can't find a solution.
I'm using following gemset:
- capybara (1.1.2)
- devise (1.5.3)
- factory_girl_rails (1.6.0)
- rails (3.2.0, 3.1.1)
- rspec (2.8.0)
- rspec-core (2.8.0)
- rspec-expectations (2.8.0)
- rspec-mocks (2.8.0)
- rspec-rails (2.8.1)
and some other gems.
Can anybody help me, getting my integration tests with a logged in user get running. In this case the news are only displayed, if a user is logged in.
Thanks.
I actually had the same exact problem, and after googling a little bit I found that including Warden::Test::Helpers
directly was a more concise solution for request specs, since it programmatically signs in/out users just like this:
# spec/support/request_helpers.rb
require 'spec_helper'
include Warden::Test::Helpers
module RequestHelpers
def create_logged_in_user
user = Factory(:user)
login(user)
user
end
def login(user)
login_as user, scope: :user
end
end
In short, just include Warden::Test::Helpers
and then use the login_as <your_user>
method and that's it!
Solution taken from here: http://simple10.com/rspec-capybara-devise-login-tests/
这篇关于rspec集成测试与devise throws NoMethodError错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!