当我在集成测试中出现
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
user_signed_in?
方法包含在Devise::Controllers::Helpers
模块中,该模块在集成测试中不可用,因此您无法使用它。
您可以选择模拟此方法(这不会真正满足您的测试需求)或通过查找仅在用户登录时才会呈现的页面内容来测试用户是否已登录,如
Logout
链接示例或 Signed in successfully
消息。
对于控制器测试,您可以使用设计测试助手
include Devise::TestHelpers
,它为您公开了 sign_in
和 sign_out
方法,更多信息请参见 Gem 的主页 https://github.com/plataformatec/devise
你不能在集成测试中使用
user_signed_in?
,就像我之前提到的那样,但是你可以编写一个简单的辅助方法来帮助你模仿这种行为
我所做的是,在 test_helper.rb 中:
def is_logged_in?
request.env['warden'].authenticated?(:user)
end
这是一个非常hacky的解决方案,但它确实有效
它起作用了。我还发现我还可以模拟 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