我正在使用RSpec 2开发Rails 3 Web应用程序,我们正在使用Devise进行身份验证。我们的控制器中有一个(很快)需要用户登录。我知道Devise提供了sign_in
测试助手,但它可以与RSpec或Mocha模拟对象一起使用吗?
我最初尝试@user = mock_model(User)
,其中user是Devise类。这不适用于sign_in :user, @user
,因为get 'index'
会重定向到登录表单。
有没有人有使用Devise进行测试的经验,可以提供帮助吗?
答案 0 :(得分:5)
我们遇到了类似的问题,但是使用了Factory Girl。我们解决了这个问题:
在spec_helper.rb中:
config.include Devise::TestHelpers, :type => :controller
在控制器规范中(只是一个包装器方法):
def login_user(user)
sign_in user
end
然后在您需要的每种方法中,您可以执行以下操作:
login_user(Factory(:user))
...您在factories.rb中定义了一个用户对象。不知道这是否适用于模拟。
答案 1 :(得分:2)
模拟永远不会起作用。当您说登录时,用户存储在会话中(基本上是用户类及其ID)。访问控制器时,将根据存储的数据检索另一个用户对象。解决问题的最佳方法是使用持久存在对象的东西,比如Factory Girl。
答案 2 :(得分:1)
我遇到了同样的问题。我现在正在做以下事情:
before(:each) do
# sign_in mock_user
request.env['warden'] = mock(Warden, :authenticate => mock_user,
:authenticate! => mock_user)
end
答案 3 :(得分:0)
我在这里为此创建了一个问题:https://github.com/plataformatec/devise/issues#issue/928 去投票!
答案 4 :(得分:0)
它们都不适合我(MRI 1.9.3-preview1,rails 3.0.1.rc5)。
这是我找到的解决方案:http://blog.joshmcarthur.com/post/6407481655/integration-tests-with-devise-and-rspec