使用Devise在Rails中进行功能测试

all*_*lar 19 testing ruby-on-rails functional-testing devise

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

我最近3次失败的测试与devise 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'
Run Code Online (Sandbox Code Playgroud)

Devise只是在这个页面中提供了功能测试指针和帮助器:http://github.com/plataformatec/devise但我不知道如何将它应用到应用程序中.

你可以给这个测试noob一些关于如何使用这些助手的详细说明吗?

all*_*lar 51

我花了一段时间,但我找到了方法.这是适合任何坚持同一点的人:

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

include Devise::TestHelpers
Run Code Online (Sandbox Code Playgroud)

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

sign_in User.first
Run Code Online (Sandbox Code Playgroud)

当然,一旦你知道如何去做就很简单了.

  • 它创建了其他错误,以在test_helper.rb文件中包含Devise :: TestHelpers.根据这个答案,它应该只包含在单独的测试文件中:http://stackoverflow.com/questions/2839328/testing-devise-with-shoulda所以我编辑了你的答案 (3认同)

Sim*_*mon 19

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

class ActionController::TestCase
  include Devise::TestHelpers
end
Run Code Online (Sandbox Code Playgroud)

更新:01.25.2017

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

Devise::Test::ControllerHelpers


hiw*_*lon 7

我对Rails比较陌生,所以我想添加一些对其他新人来说可能并不明显的东西.

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

# in users.yml    
joe: {}
Run Code Online (Sandbox Code Playgroud)

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

# a test method in some_controller_test.rb
sign_in users(:joe)
Run Code Online (Sandbox Code Playgroud)

有关Rails灯具的更多信息,请参见http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures.