【问题标题】:Making functional tests in Rails with Devise使用 Devise 在 Rails 中进行功能测试
【发布时间】:2011-03-12 08:46:12
【问题描述】:

经过 3 年的拖延,今天是我开始测试我的 Rails 应用程序的日子。我的第一步是修复我的 Rails 3 beta4 应用程序中失败的测试。

我最近 3 次失败的测试与设计 gem 及其 authenticate_user 有关!控制器顶部的 before_filter 中的方法。

通过帮助我解决这个问题,您将获得巨大的业力,因为这将使我能够从现在开始使用 TDD 方法。

这是困扰我的错误:

1) Error:
test_should_get_accepted(ModerationControllerTest):
NoMethodError: undefined method `authenticate!' for nil:NilClass
    /test/functional/moderation_controller_test.rb:10:in `test_should_get_accepted'

Devise 仅在此页面中提供功能测试指针和帮助程序:http://github.com/plataformatec/devise,但我只是不知道如何将其应用到应用程序中。

能否请你给这个测试新手一些关于如何使用这些助手的详细说明?

【问题讨论】:

    标签: ruby-on-rails testing functional-testing devise


    【解决方案1】:

    如果您希望 Devise 测试助手可用于您的所有测试,则必须将 allesklar 提到的包含在 test_helper.rb 底部的包含在类声明中,如下所示:

    class ActionController::TestCase
      include Devise::TestHelpers
    end
    

    更新:01.25.2017

    ... rails 5 发布弃用警告并要求您使用...

    Devise::Test::ControllerHelpers

    【讨论】:

      【解决方案2】:

      逐字引用https://github.com/plataformatec/devise:

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

      RSpec.configure do |config|

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

      end

      您现在可以在 RSpec 测试中使用 sign_insign_out

      【讨论】:

        【解决方案3】:

        除了 test_helpers.rb 中的代码,我在 controller_test 的顶部添加了这个,它对我有用:

        require 'test_helper'
        

        【讨论】:

          【解决方案4】:

          我花了一段时间,但我找到了方法。这是为任何卡在同一点上的人准备的:

          在 moderation_controller_test.rb 的顶部,在类声明下方,添加以下行:

          include Devise::TestHelpers
          

          我的用户夹具中有 2 条记录,我在每个测试中添加了这一行,用户必须被授权执行操作。

          sign_in User.first
          

          当然,一旦你知道怎么做,就很简单了。

          【讨论】:

          • 在 test_helper.rb 文件中包含 Devise::TestHelpers 会产生其他错误。根据这个答案,它应该只包含在单独的测试文件中:stackoverflow.com/questions/2839328/testing-devise-with-shoulda 所以我编辑了你的答案
          • 问题不在于将其放入 test_helper.rb 本身。问题是如果它的范围不正确 - 它必须在类 ActionController::TestCase 中。如果它包含在 test_helper.rb 的 ActiveSupport::TestCase 块中,事情就会变得很糟糕。
          【解决方案5】:

          我对 Rails 比较陌生,所以我想添加一些其他新手可能不明白的东西。

          关于用户夹具,我必须定义一个但将其留空以使其工作:

          # in users.yml    
          joe: {}
          

          使用 devise sign_in 助手时,您可以直接在测试中访问哈希对象:

          # a test method in some_controller_test.rb
          sign_in users(:joe)
          

          有关 Rails 固定装置的更多信息,请参阅http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-02
            • 2011-08-02
            • 1970-01-01
            • 2011-10-08
            • 1970-01-01
            • 2019-07-05
            • 2015-11-28
            相关资源
            最近更新 更多