2012-12-04 57 views
0

如何在RSpec中模擬此調用?如何在不顯式調用Kernel的情況下模擬Kernel.open或open-uri?

require 'open-uri' 
class FileFoo < ActiveRecord::Base 
    def download image_url 
    open("tmp/#{file}", 'wb') do |file| 
     file << open(image_url).read 
    end 
    end 
end 

嘗試嘲笑FileFoo.open,但這沒有奏效,因爲我使用的是下載的文件,而不是返回值。

更改代碼file << Kernel.open(image_url).read,並使用下列內容:

Kernel.stub_chain(:open, :read).and_return(File.read image_fixture) 

這工作得很好,但有一種方式來嘲笑Kernel.open().read,而不調用內核明確?

回答

2

很多時候,我認爲在這種情況下更好的測試不是嘲笑特定的文件系統調用,而是用像fakefs這樣的gem來存儲文件系統。

我談論更多關於它的博客文章叫Fake It!

的想法是,磕碰特定文件系統調用是相當脆弱的,但寫入實際文件系統不一定是單元測試希望無論是。像fakefs很多時候是一個很好的快樂媒體。

1

我想是因爲該方法download的設計很差,這是困難的。經由HTTP

  • 保存它

    1. 抓取的文件保存到磁盤

    這些獨立的功能都應該被測試,並且所述第一應嘲笑:它是做兩件事情。我沒有看到任何理由嘲笑文件系統,因爲保存文件(很小)很快且容易測試。

    如果法分爲2種方法,那麼:

    1. fetch with http將返回文件。
    2. save file會保存。

    這種方法使得嘲諷和測試簡單。

  • 相關問題