3

我想测试应用程序中的每条路由,并了解到我应该在集成测试中这样做:Where to test routes in ruby​​ on rails

但是我收到以下错误:

NoMethodError: undefined method `authenticate?' for nil:NilClass
/usr/local/Cellar/ruby/1.9.3-p194/lib/ruby/gems/1.9.1/gems/devise-2.1.2/lib/devise/rails/routes.rb:286:in `block in authenticated'

网上有说在集成测试中不能使用 Devise::TestHelpers -- Devise Google Group , Devise Github page


如何测试如下路线?

# config/routes.rb

devise_for :users

authenticated :user do
  root to: 'static#home'
end

root to: 'static#landing'

我正在运行测试单元测试$ rake test:integration

4

2 回答 2

6

Devise::TestHelpers 通过将事物直接放入会话中来工作。使用 Capybara 运行集成测试时,您无权访问服务器端会话。您只需访问浏览器即可。

在我们的应用程序中,我们的集成测试使用这样的辅助方法,通过用户界面与 Devise 交互:

def authenticate(user, password = nil)
  password ||= FactoryGirl.attributes_for(:user)[:password]
  visit new_user_session_path
  fill_in 'email', with: user.email
  fill_in 'password', with: password
  click_on 'Login'
  expect(current_path).to eq welcome_path
end
于 2013-01-01T18:58:43.407 回答
4

集成测试对于您的应用程序工作流程很重要。他们可以更清楚地说明您的URL 定义。

查看 的帖子nicholaides其中解释了此错误的原因以及经过身份验证的路由中的解决方案。

问题仍然是:

Devise 有自己的方法,你不能在 ruby​​ 中使用Devise::TestHelpers。那么如何测试呢?那么你需要以某种方式包含Devise::TestHelpers

好吧,如果您使用的是 RSpec,您可以将以下内容放入名为 的文件中spec/support/devise.rb

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

在此处指定。

但是等等............再一次,你可能会遇到同样的问题Test::Unit

然后?

因此,您只需将设计测试助手添加到test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end
于 2013-01-25T10:35:59.827 回答