如果我开始检查用户可以登录的测试:
test "can login successfully" do
get "/session/new"
assert_select "h1", "Log in to the Portal"
assert_response :success
post "/session", { username: "nick1", password: "password1" }
assert_response :redirect
follow_redirect!
assert_select "h1", "Welcome to the Portal"
end
在我的其他测试中,我想测试依赖于用户登录的内容 - 我显然不想将上述代码复制到需要用户登录的每个测试中英寸
在我的情况下,模拟登录用户只是设置session[:user_id]
的情况,所以我在设置测试中的会话数据时看了一下但看起来非常棘手。这让我想到,也许我可以将上面的代码放在某种可重用的函数中,并从任何需要登录用户的测试中调用它。
这听起来像是正确的做法吗?如果没有,这个问题通常是如何解决的?
答案 0 :(得分:2)
有没有办法重用测试代码?
minitest中的测试只是课程。这意味着您可以使用经典继承和并行继承(模块混合)。
class MyApp::IntegrationTest < ActionDispatch::IntegrationTest
def sign_in(user)
post "/session", user.attributes.slice(%w { username password })
end
end
class FooTest < MyApp::IntegrationTest
setup do
@user = User.create(username: "nick1", password: "password1")
sign_in @user
end
test "can wozzle the fozzle" do
# ...
end
end
module AuthenticationTestHelper
def sign_in(user)
post "/session", user.attributes.slice(%w { username password })
end
end
class FooTest < ActionDispatch::IntegrationTest
include AuthenticationTestHelper
setup do
@user = User.create(username: "nick1", password: "password1")
sign_in @user
end
test "can wozzle the fozzle" do
# ...
end
end
如果你正在使用Warden,你可以只包括Warden::Test::Helpers
- 如果你不是,那么你可能不应该重新发明身份验证轮。