2

我有一个我想用 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.globthenupload_dir将永远不会被调用。Dir.glob如果我在调用和调用之前放入调试器Dir.glob,那么我会看到我的一个零文件数组,所以存根肯定是有效的。但是,当测试实际调用方法Dir.glob("#{upload_dir}/*.pdf")时,它会尝试调用upload_dir.

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

4

2 回答 2

8

它调用 upload_dir 是因为它必须构建要传递给 glob 的字符串。你可以通过添加类似的东西来存根它 -

[YourClass].expects(:upload_dir).returns("foo")

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

于 2012-12-03T18:30:55.833 回答
4

@Scott 的建议可能会奏效。所以+1他的回答。

但是,您应该考虑提取该行:

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

进入一种阐明意图的方法,例如pdf_files_to_upload

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

HTH。

于 2012-12-03T19:01:59.950 回答