Rails 4.2集成测试 - 有没有办法重用测试代码?

时间:2017-04-28 09:59:44

标签: ruby-on-rails ruby testing

如果我开始检查用户可以登录的测试:

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]的情况,所以我在设置测试中的会话数据时看了一下但看起来非常棘手。这让我想到,也许我可以将上面的代码放在某种可重用的函数中,并从任何需要登录用户的测试中调用它。

这听起来像是正确的做法吗?如果没有,这个问题通常是如何解决的?

1 个答案:

答案 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 - 如果你不是,那么你可能不应该重新发明身份验证轮。