2011-12-06 63 views
0

我有一個文檔管理系統,我在前一段時間在Rails 2.3.8中進行了編程,在重構和增強功能之前,我已經對該項目進行了一些rspec測試。rspec測試文件和fileutils

問題是我的很多測試都需要將大部分文件& FileUtils庫保留下來,因爲模型中有很多文件交互。有沒有更好的方法來測試文件&目錄操作,而不必接觸文件系統?

比如我,踩滅mkdir_p:

FileUtils.stub!(:mkdir_p) 

,當我移動我用的是這樣的:

FileUtils.should_receive(:mv).with("from path","to path") 

回答

2

使用fakefs。這是完美的目的。

+0

當我在Rails 2.3.8 environment.rb文件'config.gem「fakefs」,:require =>「fakefs/safe」中放入以下內容並運行rake時,它告訴我它找不到名爲: awesome_nested_set'是不兼容的嗎?僞碼與Rails 2.x一起工作? – map7

0

我不會建議改變文件或文件實用程序類,因爲這些更改將影響所有正在運行的單元測試。當你有很多不同的測試時,很難跟蹤這些變化,並且你的測試將開始相互影響(這通常是不好的測試實踐)。

我建議明確地使用一個簡單的手動Dependency Injection辦法像構造器注入:

class UnderTest 
    def initialize file_creator = FileUtils 
    @file_creator = file_creator 
    end 

    def use_file_utils  
    @file_creator.mkdir('some_dir') 
    end 
end 

在RSpec的測試:

fake_file_utils = mock "FileUtils" 
test = UnderTest.new fake_file_utils 
test.use_file_utils 
+0

這是有道理的,但每次我嘗試這個抱怨'write_attribute_without_dirty'。我是否必須在初始化程序中添加'def intialize(* args)'或包含'super'? – map7

+0

@ map7,write_attribute_without_dirty是一個ActiveRecord方法。你能用被測試的類的代碼,測試和錯誤信息來更新問題嗎? –

+0

@ map7,覺得我明白了。你正在測試另一個類的子類(在你的情況下它是ActiveRecord類的子類)。然後,您需要從overriden構造函數中調用super(具有基類params所需的全部),以便初始化基類。 –