2

rspec と Mocha を使用してテストしたいメソッドがあります。Dir.glob私の目的は、1 つのファイルの単純な配列を返すためにスタブアウトすることです。メソッドは次のように定義されます。

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.globupload_dirDir.globと callの呼び出しの前にデバッガーを配置するとDir.glob、1 つのゼロ ファイルの配列が表示されるため、スタブは確実に機能します。ただし、テストが実際にメソッドDir.glob("#{upload_dir}/*.pdf")を呼び出すときは、次に を呼び出そうとしていますupload_dir

Ruby 1.9.3、rspec 2.12.0、mocha 0.13.0 を使用しています。

4

2 に答える 2

8

グロブに渡す文字列を作成する必要があるため、upload_dir を呼び出します。次のようなものを追加してスタブできます-

[あなたのクラス].expects(:upload_dir).returns("foo")

次に、コードが "foo/*.pdf" を glob に渡すことを期待します。

于 2012-12-03T18:30:55.833 に答える
4

@Scottが示唆することはおそらくうまくいくでしょう。だから彼の答えに+1。

ただし、次の行を抽出することを検討する必要があります。

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

たとえば、意図を明確にする方法にpdf_files_to_upload

次に、テスト対象のオブジェクトでそのメソッドをスタブアウトして、必要に応じて配列を返すことができます。これで、upload_dir メソッドから完全に切り離され、PDF ファイルのリストがどのように生成されるかを気にする必要がなくなります。より宣言的なmy_method結果が得られます。

HTH。

于 2012-12-03T19:01:59.950 に答える