如何真正重置单元测试?

时间:2011-03-31 07:55:50

标签: ruby unit-testing reset

我想测试类和gem加载。看看下面这个愚蠢的测试用例:

require 'rubygems'
require 'shoulda'

class SimpleTest < Test::Unit::TestCase

    context 'This test' do

       should 'first load something' do
           require 'bundler'

           assert Object.const_defined? :Bundler
       end

       should 'second have it reset again' do
           assert !Object.const_defined?(:Bundler)
       end

       teardown do
         # This works, but is tedious and unclean
         #Object.send :remove_const, :Bundler rescue nil

         # Instead I want something like this ;)
         magic_reset
       end

    end

end

4 个答案:

答案 0 :(得分:3)

如何创建在分叉进程中运行测试方法的Test::Unit::TestCase子类?

class ForkingTestCase < Test::Unit::TestCase
  def run(...)
    fork do
      super.run(...)

      # somehow communicate the result back to the parent process
      # this is the hard part
    end
  end  
end

如果可以实现,那么只需更改测试用例的基类即可。

答案 1 :(得分:2)

AFAIK,您无法卸载已加载的文件。您需要为每个测试启动一个单独的Ruby进程。 (或者如果您在同一进程中支持多个实例的Ruby实现上运行,则使用单独的Ruby实例。)

答案 2 :(得分:0)

尝试使用Kernel#load并将wrap设置为true:

  

load(filename,wrap = false)→true

     

在文件filename中加载并执行Ruby程序。如果   filename没有解析为绝对路径,搜索文件   for在$:中列出的库目录中。如果是可选的包装   参数为true,加载的脚本将在一个下执行   匿名模块,保护调用程序的全局命名空间。   在任何情况下,加载文件中的任何局部变量都不会   传播到加载环境。

每次你想对bundler load进行一个新的匿名模块的测试,在该模块中的bundler类上进行测试,然后进行下一次测试。

如果您的代码引用Bundler常量,那么您必须设置和取消设置该常量。

我自己没有尝试过,但不明白为什么它不起作用。

答案 3 :(得分:-1)

尝试跟踪测试开始前定义的常量,以及测试完成后定义的常量,并删除测试期间定义的常量。

我想这并不是在告诉你如何调用magic_reset作为如何实现magic_reset。