我有一个方法我想用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。
答案 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。