在stpec中存根需要声明?

时间:2014-12-01 15:23:38

标签: ruby rspec require stubbing

我必须维护一个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

2 个答案:

答案 0 :(得分:2)

而不是将require作为"继承"而不是来自Kernel,你可以这样做:

  1. 在$ LOAD_PATH中的某个位置创建一个虚拟incompatible_lib.rb文件。即,如果这是一个Ruby应用程序(不是Rails),请不要将它放在lib/spec/中。
  2. 您可以通过多种方式执行此操作,但我会告诉您一种方法:在您的spec文件中测试Script,修改$ LOAD_PATH以包含虚拟<的父目录/ strong> incompatible_lib.rb
  3. 订购非常重要 - 接下来您将包含script.rb(定义{{​​1}}的文件)。
  4. 这将解决您的问题并允许您测试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编译器上执行的遗留代码,我无法轻松地运行这些库,这足以让我测试我的修改...