重用最小的集成测试

问题描述 投票:2回答:2

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

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

UNDRY:

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

我还没有弄清楚如何编写模块,所以毫无疑问这不起作用。有人能指出我正确的方向吗?

ruby-on-rails ruby ruby-on-rails-4 minitest
2个回答
4
投票

在使用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的Test 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时共享测试的唯一方法是将模块包含在您希望它们所在的每个describe块中。所有其他非测试方法,包括beforeafter钩子,以及let访问器,将被继承


0
投票

在使用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
© www.soinside.com 2019 - 2024. All rights reserved.