2

我在 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

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

4

2 回答 2

4

describe使用 Minitest 的规范 DSL 时在不同块之间共享测试的方法是将模块包含在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 时共享测试的唯一方法是将模块包含在describe您希望它们所在的每个块中。所有其他非测试方法,包括beforeandafter钩子和let访问器,都将被继承

于 2013-09-10T22:47:39.997 回答
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
于 2019-03-12T18:43:27.527 回答