如何在Ruby中继承抽象单元测试?

Gra*_*oss 2 ruby inheritance unit-testing testunit

我有两个单元测试,应该使用略有不同的设置方法共享许多常见测试.如果我写的东西像

class Abstract < Test::Unit::TestCase
  def setup
    @field = create
  end

  def test_1
    ...
  end
end

class Concrete1 < Abstract
  def create
    SomeClass1.new
  end
end

class Concrete2 < Abstract
  def create
    SomeClass2.new
  end
end
Run Code Online (Sandbox Code Playgroud)

然后Concrete1似乎没有从Abstract继承测试.或者至少我不能让它们在日食中运行.如果我为包含Concrete1的文件选择"Run all TestCases",那么即使我不想要它也会运行Abstract.如果我指定Concrete1那么它根本不运行任何测试!如果我在Concrete1中指定test_1,那么它会抱怨它无法找到它("uncaught throw:invalid_test(ArgumentError)").

我是Ruby的新手.我在这里错过了什么?

Mar*_*off 7

问题是,据我所知,Test::Unit跟踪哪些类继承Test::Unit::TestCase,因此,只会直接继承它的类中运行测试.

解决此问题的方法是使用所需的测试创建一个模块,然后将该模块包含在派生自的类中Test::Unit::TestCase.

require 'test/unit'

module TestsToInclude
  def test_name
    assert(self.class.name.start_with?("Concrete"))
  end
end

class Concrete1 < Test::Unit::TestCase
  include TestsToInclude

  def test_something_bad
    assert(false)
  end
end

class Concrete2 < Test::Unit::TestCase
  include TestsToInclude

  def test_something_good
    assert(true)
  end
end
Run Code Online (Sandbox Code Playgroud)

输出:

Loaded suite a
Started
.F..
Finished in 0.027873 seconds.

  1) Failure:
test_something_bad(Concrete1) [a.rb:13]:
<false> is not true.

4 tests, 4 assertions, 1 failures, 0 errors

shell returned 1