【问题标题】:Reusing minitest integration tests重用 minitest 集成测试
【发布时间】:2013-09-06 01:24:32
【问题描述】:

我在 Rails 中有三个页面都显示相同的标题,因此需要完全相同的集成测试。

与其重复我自己并编写看起来几乎完全相同的单独测试,这里最好的方法是什么?我尝试将共享断言放入模块中,但未能成功将其加载到每个测试场景中。

温德里:

class IntegrationTest
  describe "page one" do

    before { visit page_one_path }

    it "should have a home page link" do
      page.find_link "Home"
    end
  end

  describe "page two" do

    before { visit page_two_path }

    it "should have a home page link" do
      page.find_link "Home"
    end
  end

  describe "page three" do

    before { visit page_three_path }

    it "should have a home page link" do
      page.find_link "Home"
    end
  end
end

尝试烘干失败...

模块:

/lib/tests/shared_test.rb

module SharedTest

  def test_header
    it "should have a home page link" do
      page.find_link "Home"
    end
  end
end

测试:

class IntegrationTest
  include SharedTest

  describe "page one" do
    before { visit page_one_path }
    test_header
  end

  describe "page two" do
    before { visit page_two_path }
    test_header        
  end

  describe "page three" do
    before { visit page_three_path }
    test_header
  end
end

我还没有完全弄清楚如何编写模块,所以这不起作用也就不足为奇了。有人能指出我正确的方向吗?

【问题讨论】:

  • 首先,我不确定是否有必要对每个控制器操作进行测试,除非您不断更改布局(即便如此,也可能有更简单的测试方法)。对于在 MiniTest 中使用共享示例的问题的更一般的答案,docs 建议:“如果您确实想要继承,请使用 minitest/unit。您可以随意混合和匹配断言和期望。”

标签: ruby-on-rails ruby ruby-on-rails-4 minitest


【解决方案1】:

在使用 Minitest 的规范 DSL 时,在不同的 describe 块之间共享测试的方法是将模块包含在您希望运行这些测试的每个 describe 块中。

module SharedTest
  def test_header
    assert_link "Home"
  end
end

class IntegrationTest < ActiveDispatch::IntegrationTest
  describe "page one" do
    include SharedTest
    before { visit page_one_path }
  end

  describe "page two" do
    include SharedTest
    before { visit page_two_path }
  end

  describe "page three" do
    include SharedTest
    before { visit page_three_path }
  end
end

Minitest 的测试 API 与 Minitest Spec DSL 的不同之处在于它们在被继承时的行为方式。考虑以下几点:

class PageOneTest < ActiveDispatch::IntegrationTest
  def setup
    visit page_one_path
  end

  def test_header
    assert_link "Home"
  end
end

class PageTwoTest < PageOneTest
  def setup
    visit page_two_path
  end
end

class PageThreeTest < PageOneTest
  def setup
    visit page_three_path
  end
end

PageTwoTest 和 PageThreeTest 测试类继承自 PageOneTest,因此它们都具有 test_header 方法。 Minitest 将运行所有三个测试。但是,当使用规范 DSL 实现时,test_header 方法不会被继承。

class PageOneTest < ActiveDispatch::IntegrationTest
  def setup
    visit page_one_path
  end

  def test_header
    assert_link "Home"
  end

  describe "page two" do
    before { visit page_two_path }
  end

  describe "page three" do
    before { visit page_three_path }
  end
end

在这种情况下,只运行一个测试。 describe "page two" 创建的测试类将继承自 PageOneTest,但会删除所有测试方法。为什么?因为 Minitest 的规范 DSL 是基于 RSpec 的,这就是 RSpec 的工作方式。 Minitest 不遗余力地对使用规范 DSL 时继承的测试方法进行核对。因此,在使用规范 DSL 时共享 tests 的唯一方法是将模块包含在您希望它们所在的每个 describe 块中。所有其他非test 方法,包括 beforeafter 钩子,以及 let 访问器,将被继承

【讨论】:

    【解决方案2】:

    在使用 MiniTest 的规范 DSL 时,这是一种重用测试的简洁方法 - 在函数中定义测试,然后在要包含测试的地方调用该函数。

    例子:

    def include_shared_header_tests
      it "should be longer than 5 characters" do
        assert subject.length > 5
      end
    
      it "should have at least one capital letter" do
        assert /[A-Z]/ =~ subject
      end
    end
    
    # This block will pass
    describe "A good header" end
      subject { "I'm a great header!" }
    
      include_shared_header_tests
    end
    
    # This block will fail
    describe "A bad header" end
      subject { "bad" }
    
      include_shared_header_tests
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多