【问题标题】:Encapsulate repeated assertions in a function将重复的断言封装在一个函数中
【发布时间】:2017-08-31 14:51:31
【问题描述】:

我有几个集成测试,其中一些断言是相同的。出于可维护性的考虑,我想将每个测试的通用断言重新组合到一个独特的功能下。

  test "login with invalid information" do
    get login_path
    assert_template 'sessions/new'
    post login_path, params: { session: { email: "", password: "" } }
    assert_template 'sessions/new'
    assert_not flash.empty?
    get root_path
    assert flash.empty?
  end

  test "login with valid information followed by logout" do
    get login_path
    assert_template 'sessions/new'
    post login_path, params: { session: { email: @user.email, password: "password" } }
    .

  end

例如,

get login_path
assert_template 'sessions/new'

位在两个测试中重复。我怎样才能使它更易于维护?

【问题讨论】:

    标签: ruby-on-rails testing integration-testing


    【解决方案1】:

    您描述为“重复”的部分不应在每个测试中都断言。如果第一个测试在断言模板时失败,那么使用相同断言的其他测试也将失败。这意味着您应该将该测试逻辑提取到单个测试中,例如 test 'login rendered template' 并从其他测试中删除那些 getassert_template

    test "login rendered template" do
      get login_path
      assert_template 'sessions/new'
    end
    
    test "login with invalid information" do
      # template assertion already done in previous test
      post login_path, params: { session: { email: "", password: "" } }
      # [...]
    end
    

    这是测试您的应用时的不良做法示例。单个测试应该对特定的逻辑/功能做出断言,而不是重复。如果您在测试套件中看到重复的代码/断言片段,则可能应该将其提取到单个测试中。

    【讨论】:

      猜你喜欢
      • 2012-06-03
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2012-08-11
      • 2017-12-19
      • 1970-01-01
      相关资源
      最近更新 更多