我想测试类和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
答案 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。