我正在尝试编写一个自定义工具,使用我的自定义运行 ruby 单元测试。
我需要它做的是从给定文件(通过 require 或其他)加载某个 TestCase,然后在进行一些计算和初始化后运行它。
问题是,当我需要“测试/单元”和测试用例时,它会立即运行。
我能用这个做什么?
谢谢。
我正在尝试编写一个自定义工具,使用我的自定义运行 ruby 单元测试。
我需要它做的是从给定文件(通过 require 或其他)加载某个 TestCase,然后在进行一些计算和初始化后运行它。
问题是,当我需要“测试/单元”和测试用例时,它会立即运行。
我能用这个做什么?
谢谢。
将文件内容作为常规文本文件读取并在eval
初始化/计算您所说的内容后对其内容进行处理怎么样?它可能不足以满足您的需求,并且可能需要手动设置和执行测试框架。
像那样(我放了heredoc而不是阅读文件)。基本上内容只是一个包含测试用例代码的字符串。
content = <<TEST_CASE
class YourTestCase
def hello
puts 'Hello from eval'
end
end
YourTestCase.new.hello
TEST_CASE
eval content
eval
注意:如果有其他方法,我宁愿不使用。eval
在使用任何语言手动从字符串中获取代码时,应该格外小心。
由于您正在运行 1.9 并且 1.9 中的 test/unit 只是 MiniTest 的包装器,因此以下方法应该有效:
类似的东西(来自EndOfLine Custom Test Runner的无耻插件,调整为 Ruby 1.9):
fastfailrunner.rb:
require 'test/unit'
class FastFailRunner19 < MiniTest::Unit
def _run args = []
puts "fast fail runner"
end
end
~
example_test.rb:
require 'test/unit'
class ExampleTest < Test::Unit::TestCase
def test_assert_equal
assert_equal 1, 1
end
def test_lies
assert false
end
def test_exceptions
raise Exception, 'Beware the Jubjub bird, and shun the frumious Bandersnatch!'
end
def test_truth
assert true
end
end
运行.rb:
require_relative 'fast_fail_runner'
require_relative 'example_test'
MiniTest::Unit.runner= FastFailRunner19.new
如果你运行这个
ruby run.rb
将使用自定义的 FastFailRunner19,它什么都不做。
您可以收集要延迟其执行的测试用例并将它们存储在一个数组中。之后,您将创建一个块执行代码。例如:
test_files = ['test/unit/first_test.rb'] #=> Testcases you want to run
test_block = Proc.new {spec_files.each {|f|load f} } #=> block storing the actual execution of those tests.
一旦您准备好调用这些测试用例,您只需执行test_block.call
.
概括地说,当考虑推迟或延迟代码执行时,closures
这是一个非常优雅和灵活的选择。