2012-02-12 1 views
2

私はずっと広く検索しましたが、誰かがこの質問に答えられることを願っています。私は、次のコードを使用してスタブを '存在する?' RSpecのスペックでファイルテストのための方法:rspecで特定のファイルをスタブするにはどうしたらいいですか?

​​

私が本当にやりたいことは、非常に特定のファイルの存在をスタブアウトされていることを確認することです。私はこのようなものが仕事をすることを望んでいた:

it "returns no error if file does exist" do 
    @loader = MovieLoader.new 
    lambda { 
    FileTest.stub!(:exists?).with(MovieLoader.data_file).and_return(true) 
    @loader.load_file 
    }.should_not raise_error("File Does Not Exist") 
end 

しかし、これは動作していないようです。私は 'with'メソッドが実際に何をしているかについてのドキュメントを見つけるのが非常に困難です。おそらく私は間違った木を完全に吠えているでしょう。

ガイダンスを提供できますか?

+0

エラーメッセージは何ですか? –

+0

こんにちはDavidさん。申し訳ありませんが、私はあなたの回答を早く見ませんでした。私は失敗メッセージを受け取っていませんでした。私はちょうど特定のファイルをチェックする方法でテストを書く方法を理解できませんでした。私はそれを動作させるためにテストを再編成しました。ありがとう。 – Agazoom

答えて

2

RSpecスタブリングフレームワークは少し望ましいものですが、これがその1つです。 stub!(:something).with("a thing")は、somethingメソッドが呼び出されるたびに"a thing"を入力として受け取るようにします。 "a thing"以外を受信すると、RSpecはテストを中止し、エラーを報告します。

私はあなたが望むものを達成することができると思いますが、ちょっと違ったアプローチをしてください。 FileTestをスタブするのではなく、@loaderインスタンスのメソッドをスタブする必要があり、そのメソッドは通常FileTest.exists?を呼び出します。うまくいけば、これは私が取得しています何を示しています

class MovieLoader 
    def load_file 
    perform_loading if file_exists?(file_path) 
    end 

    def file_exists?(path) 
    FileTest.exists? path 
    end 
end 

あなたのテストはその後、次のようになります。

it "returns no error if file does exist" do 
    @loader = MovieLoader.new 
    lambda { 
    @loader.stub!(:file_exists?).with(MovieLoader.data_file).and_return(true) 
    @loader.load_file 
    }.should_not raise_error("File Does Not Exist") 
end 

は今、あなただけのローダの1つのインスタンスをスタブされているので、他のインスタンスがスタブを継承することはありませんバージョンfile_exists?。それよりもきめ細かくする必要がある場合は、おそらく、RSpecがサポートするstubba、mochaなどの別のスタブフレームワークを使用する必要があります。

+0

あなたはrspec-mockでできないmochaをどう使っていますか? –

+0

お返事ありがとうございます。私のスタブのバージョンでは、FileTest.stubs!すべてのテストで完全にスタブアウトされていますか? (私はこのすべての初心者ですので、明白な質問をしている場合は許してください)。 – Agazoom

+0

@DavidChelimsky私は、それらのライブラリがOPが望んでいたものを達成できると示唆していませんでした。私は個人的にはモカやスタバを一度も使用していませんが、持っている人を知っています。 – siannopollo

関連する問題