使用Mocha挖出类方法

时间:2012-12-03 18:22:20

标签: ruby rspec mocha

我有一个方法我想用rspec和Mocha进行测试。我的目标是删除Dir.glob以便只返回一个文件的简单数组。该方法定义如下:

def my_method
  Dir.glob("#{upload_dir}/*.pdf").each do |file|
    ...
  end
end

测试:

it "ignores a file of no size" do
  zero_file = File.expand_path("../fixtures/zero_size_file_12345.pdf", __FILE__)
  Dir.expects(:glob).returns([zero_file])

  ...
end

问题是方法upload_dir不是我想在这里测试的,我假设如果我删除了对Dir.glob的任何调用,那么upload_dir永远不会被调用。如果我在调用Dir.glob之前调试调试器并调用Dir.glob,那么我会看到我的数组为零文件,因此存根肯定有效。但是,当测试实际调用方法Dir.glob("#{upload_dir}/*.pdf")时,它会尝试调用upload_dir

我正在使用Ruby 1.9.3,rspec 2.12.0和mocha 0.13.0。

2 个答案:

答案 0 :(得分:8)

它调用upload_dir,因为它必须构建要传递给glob的字符串。您可以通过添加类似 -

之类的东西来存根

[YourClass] .expects(:upload_dir).returns( “富”)

然后期望你的代码将“foo / * .pdf”传递给glob。

答案 1 :(得分:4)

@Scott建议可能有用。所以+1为他的答案。

但是,你应该考虑提取这一行:

Dir.glob("#{upload_dir}/*.pdf")

用于澄清意图的方法,例如pdf_files_to_upload

然后,您可以在被测对象上存根该方法,以根据需要返回数组。然后,您将完全与upload_dir方法分离,无需关心如何生成PDF文件列表。会产生更具声明性的my_method

HTH。