0

ruby 文件 test.rb 中有一个类

#test.rb
class AAA<TestCase
  def setUp()
     puts "setup"
  end
  def run()
     puts "run"
  end
  def tearDown()

  end
end

在另一个文件 test2.rb 中,我想通过文件名“test.rb”获取 AAA 的实例。在python中,我可以通过以下方式做到这一点:

casename = __import__ ("test")
for testcase in [getattr(casename, x) for x in dir(casename)]:
    if type(testcase) is type and issubclass(testcase, TestCase):
             #do something with testcase()

我现在如何在 ruby​​ 中实现相同的功能。谢谢

4

1 回答 1

1

只需要没有.rb扩展名的文件名,如下所示:

require './test'

假设你有这个目录结构:

+-- project/
|   |
|   +-- folder1/
|   |   |
|   |   +-- file1.rb
|   |
|   +-- folder2/
|       |
|       +-- file2.rb
|
+-- file3.rb

在这种情况下,您可能希望将特定目录添加到加载路径,如下所示:

# in file3.rb
$LOAD_PATH.unshift './folder1'

这样,您可以按名称要求文件,而无需每次都指定文件夹:

require 'file1'

现在是第二部分,获取一个实例。你可以这样做AAA.new,但我想你想动态地创建属于TestCase. 首先,您必须找到 的所有子类TestCase

class Class
  def subclasses
    constants.map do |c|
      const_get(c) 
    end.select do |c|
      c.is_a? Class
    end
  end
end

这将使您能够获得如下子类的列表:

TestCase.subclasses
#=> [TestCase::AAA]

您可以从中构造对象

TestCase.subclasses.map{|klass| klass.new }
#=> [#<TestCase::AAA:0x007fc8296b07f8>]

如果您不需要将参数传递给new

TestCase.subclasses.map(&:new)
#=> [#<TestCase::AAA:0x007fc8296b07d0>]

到目前为止,一切都很好。但是,如果我做对了,那么您正在尝试构建一个测试运行器。不。那里有很多测试库和出色的测试运行器。Ruby 有内置的 Minitest,这篇博文很好地解释了如何最好地运行测试。

于 2013-05-27T15:43:20.863 回答