我正在尝试编写一个使用我的自定义项运行ruby单元测试的自定义工具。
我需要它做的是从给定文件加载某个TestCase(通过require或其他),然后在进行一些计算和初始化后运行它。
问题是,当我需要“测试/单元”和测试用例时,它会立即运行。
我该怎么办?
感谢。
答案 0 :(得分:1)
在初始化/计算您说的内容后,将文件内容作为常规文本文件读取并对其内容执行eval
怎么样?它可能不足以满足您的需求,可能需要手动设置和执行测试框架。
就像那样(我把heredoc而不是读取文件)。基本上,content只是一个包含测试用例代码的字符串。
content = <<TEST_CASE
class YourTestCase
def hello
puts 'Hello from eval'
end
end
YourTestCase.new.hello
TEST_CASE
eval content
注意:如果有其他方法,我宁愿不使用eval
。在使用任何语言手动eval
来自字符串的代码时,应该格外小心。
答案 1 :(得分:1)
由于您运行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
run.rb:
require_relative 'fast_fail_runner'
require_relative 'example_test'
MiniTest::Unit.runner= FastFailRunner19.new
如果你用
运行它 ruby run.rb
将使用自定义FastFailRunner19,它什么都不做。
答案 2 :(得分:0)
您可以收集要延迟执行的测试用例并将其存储在数组中。然后,您将创建一个块执行代码。例如:
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
是一种非常优雅和灵活的选择。