模拟不与RSpec和Devise合作

时间:2010-11-19 22:59:14

标签: ruby-on-rails-3 rspec devise

我正在使用RSpec 2开发Rails 3 Web应用程序,我们正在使用Devise进行身份验证。我们的控制器中有一个(很快)需要用户登录。我知道Devise提供了sign_in测试助手,但它可以与RSpec或Mocha模拟对象一起使用吗?

我最初尝试@user = mock_model(User),其中user是Devise类。这不适用于sign_in :user, @user,因为get 'index'会重定向到登录表单。

有没有人有使用Devise进行测试的经验,可以提供帮助吗?

5 个答案:

答案 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