【问题标题】:Mocks aren't working with RSpec and Devise模拟不适用于 RSpec 和 Devise
【发布时间】:2010-11-19 22:59:13
【问题描述】:

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

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

有没有人有任何使用 Devise 测试的经验并且可以提供帮助?

【问题讨论】:

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


    【解决方案1】:

    我们遇到了类似的问题,但使用的是 Factory Girl。我们是这样解决的:

    在 spec_helper.rb 中:

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

    在控制器规范中(只是一个包装方法):

    def login_user(user)
        sign_in user
    end
    

    然后在您需要的每种方法中,您都可以这样做:

    login_user(Factory(:user))
    

    ... 您在 factory.rb 中定义了一个用户对象。不过不确定这是否适用于模拟。

    【讨论】:

    • 我希望我能做的不仅仅是谢谢!它节省了我阅读错误和坏建议的时间。
    【解决方案2】:

    模拟永远不会起作用。当您说登录时,用户存储在会话中(基本上,用户类及其 id)。当您访问控制器时,会根据存储的数据检索另一个用户对象。解决问题的最佳方法是使用持久化对象的方法,例如 Factory Girl。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。我现在正在执行以下操作:

      before(:each) do
        # sign_in mock_user
        request.env['warden'] = mock(Warden, :authenticate => mock_user,
                                             :authenticate! => mock_user)
      end
      

      【讨论】:

        【解决方案4】:

        我在这里创建了一个问题:https://github.com/plataformatec/devise/issues#issue/928 去投票吧!

        【讨论】:

          【解决方案5】:

          它们都不适合我(MRI 1.9.3-preview1,rails 3.0.1.rc5)。

          这是我找到的解决方案:http://blog.joshmcarthur.com/post/6407481655/integration-tests-with-devise-and-rspec

          【讨论】:

            猜你喜欢
            • 2012-10-30
            • 2012-09-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-20
            • 2018-10-24
            相关资源
            最近更新 更多