如何使用user_signed_in设备?集成测试中的方法?

问题描述 投票:0回答:3

当我在集成测试中出现

assert user_signed_in?
时,它表示该方法未定义。 有没有办法在我的测试中使用这种方法? 我正在使用 Rails 4 和最新版本的 devise。 这是我的测试文件:

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

test "valid signup information" do
    get new_user_registration_path
    assert_difference 'User.count', 1 do
      post_via_redirect user_registration_path, 
                                     user: { first_name: "Example",
                                             last_name:  "User",
                                             email:      "[email protected]",
                                             password:              "password",
                                             password_confirmation: "password" }
    end
    assert_template 'activities/index'
    assert user_signed_in?
  end
ruby-on-rails devise
3个回答
7
投票

user_signed_in?
方法包含在
Devise::Controllers::Helpers
模块中,该模块在集成测试中不可用,因此您无法使用它。

您可以选择模拟此方法(这不会真正满足您的测试需求)或通过查找仅在用户登录时才会呈现的页面内容来测试用户是否已登录,如

Logout
链接示例或
Signed in successfully
消息。

对于控制器测试,您可以使用设计测试助手

include Devise::TestHelpers
,它为您公开了
sign_in
sign_out
方法,更多信息请参见 Gem 的主页 https://github.com/plataformatec/devise


2
投票

你不能在集成测试中使用

user_signed_in?
,就像我之前提到的那样,但是你可以编写一个简单的辅助方法来帮助你模仿这种行为

我所做的是,在 test_helper.rb 中:

 def is_logged_in?
  request.env['warden'].authenticated?(:user)
 end

这是一个非常hacky的解决方案,但它确实有效


0
投票

它起作用了。我还发现我还可以模拟 current_user 并将其添加到我的 test_helper.rb

class ActionDispatch::IntegrationTest
  include Devise::Test::IntegrationHelpers

  def is_logged_in?
    request.env['warden'].authenticated?(:user)
  end

  def current_user
    request.env['warden'].user
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.