0

RSpecでこの呼び出しをモックする方法は?

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これは正常に動作しますが、カーネルを明示的に呼び出さずにモックする方法はありますか?

4

2 に答える 2

2

多くの場合、この状況でのより良いテストは、特定のファイルシステム呼び出しをモックするのではなく、その代わりにfakefsのような gem でファイルシステムをスタブ化することだと思います。

それについては、Fake It!というブログ記事で詳しく説明しています。.

特定のファイルシステム呼び出しをスタブ化するのは非常に脆弱ですが、実際のファイルシステムへの書き込みは単体テストでも必ずしも望ましいとは限りません。fakefsのようなものは、多くの場合、素晴らしい幸せな媒体です。

于 2012-12-05T04:45:41.373 に答える
1

downloadメソッドの設計が悪いので、これは難しいと思います。それは2つのことをしています:

  1. HTTP経由でファイルをフェッチする
  2. ディスクに保存する

これらの個別の機能は両方ともテストする必要があり、最初の機能はモックする必要があります。ファイル(小さい)の保存は高速で簡単にテストできるため、ファイルシステムをモックする理由はわかりません。

メソッドが2つのメソッドに分割された場合、次のようになります。

  1. fetch with httpファイルを返します。
  2. save fileそれを保存します。

このアプローチにより、モックとテストが簡単になります。

于 2012-12-09T15:43:50.790 に答える