2012-12-03 29 views
1

我有一个方法,我想使用rspec和Mocha来测试。我的目标是剔除Dir.glob以便返回一个简单的一个文件数组。该方法被定义为这样:使用Mocha剔除类方法

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。

回答

7

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

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

,然后期望你的代码通过 “富/ * PDF。” glob的到。

4

@Scott建议可能会起作用。所以他的答案+1。

但是,你应该想想提取出列:

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

成方法阐明意图,例如为pdf_files_to_upload

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

HTH。