2011-12-06 29 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 'は互換性がありませんか? fakefsはRails 2.xで動作しますか? – map7

0

これらので、私は、ファイルまたはのfileutilsのクラスを変更することはお勧めしませんが変更は、実行中の単体テストに影響します。異なるテストがたくさんあり、テストがお互いに影響を及ぼし始めると、これらの変更を追跡するのは難しいでしょう(これは一般にテストの練習が悪いことです)。 RSpecのテストでは

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

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

私は明示的にコンストラクタ・インジェクションのような単純なマニュアル Dependency Injectionアプローチを使用することを提案

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クラスの子です)。次に、基底クラスを初期化するために、オーバーライドされたコンストラクタからsuper(基本クラスのparamsに必要なものすべて)を呼び出す必要があります。 –

関連する問題