我必须维护一个Ruby脚本,这需要一些我本地没有的lib,这些lib在我的环境中不起作用。不过我想在这个脚本中指定一些方法,以便我可以轻松地更改它们。
是否可以选择在我想测试的脚本中存储一些require
语句,以便可以通过rspec加载它,并且可以在我的环境中执行规范?
示例(old_script.rb
):
require "incompatible_lib"
class Script
def some_other_stuff
...
end
def add(a,b)
a+b
end
end
如何编写测试来检查add
函数而不拆分“old_Script.rb”文件并且不提供我没有的incompatible_lib
?
答案 0 :(得分:2)
而不是将require
作为"继承"而不是来自Kernel
,你可以这样做:
incompatible_lib.rb
文件。即,如果这是一个Ruby应用程序(不是Rails),请不要将它放在lib/
或spec/
中。Script
,修改$ LOAD_PATH以包含虚拟<的父目录/ strong> incompatible_lib.rb
。script.rb
(定义{{1}}的文件)。这将解决您的问题并允许您测试Script
方法。
一旦您成功测试add
,我强烈建议您重新构建它,以便您不必执行此操作,这是一种黑客攻击,恕我直言。
答案 1 :(得分:2)
谢谢,我也考虑过添加文件的选项,但最终在测试用例中攻击了require本身:
module Kernel
alias :old_require :require
def require(path)
old_require(path) unless LIBS_TO_SKIP.include?(path)
end
end
我知道这是一个丑陋的黑客,但由于这是在修改后的ruby编译器上执行的遗留代码,我无法轻松地运行这些库,这足以让我测试我的修改...