加载Ruby TestCase而不运行它

时间:2013-03-11 11:43:10

标签: ruby unit-testing testunit

我正在尝试编写一个使用我的自定义项运行ruby单元测试的自定义工具。

我需要它做的是从给定文件加载某个TestCase(通过require或其他),然后在进行一些计算和初始化后运行它。

问题是,当我需要“测试/单元”和测试用例时,它会立即运行。

我该怎么办?

感谢。

3 个答案:

答案 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的包装器,因此以下方法应该有效:

  • 实施您自己的自定义Runner
  • 将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是一种非常优雅和灵活的选择。