1

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

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

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

我能用这个做什么?

谢谢。

4

3 回答 3

1

将文件内容作为常规文本文件读取并在eval初始化/计算您所说的内容后对其内容进行处理怎么样?它可能不足以满足您的需求,并且可能需要手动设置和执行测试框架。

像那样(我放了heredoc而不是阅读文件)。基本上内容只是一个包含测试用例代码的字符串。

content = <<TEST_CASE
  class YourTestCase

    def hello
      puts 'Hello from eval'
    end

  end
  YourTestCase.new.hello
TEST_CASE

eval content 

eval注意:如果有其他方法,我宁愿不使用。eval在使用任何语言手动从字符串中获取代码时,应该格外小心。

于 2013-03-11T11:59:06.217 回答
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

运行.rb:

require_relative 'fast_fail_runner'
require_relative 'example_test'

MiniTest::Unit.runner= FastFailRunner19.new

如果你运行这个

  ruby run.rb

将使用自定义的 FastFailRunner19,它什么都不做。

于 2013-03-11T12:55:06.443 回答
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这是一个非常优雅和灵活的选择。

于 2013-03-11T12:28:12.210 回答