ユーザーがアップロードした画像を Amazon S3 に保存する Rails 2.2.2 アプリを継承しました。attachment_fu ベースのPhoto
モデルは、S3 と MiniMagick から画像を取得して回転を実行するrotate
メソッドを提供します。open-uri
このrotate
メソッドには、MiniMagick で使用する画像を取得する次の行が含まれています。
temp_image = MiniMagick::Image.from_file(open(self.public_filename).path)
self.public_filename
のようなものを返します
http://s3.amazonaws.com/bucketname/photos/98/photo.jpg
画像を取得して回転させることは、運用中および開発中の実行中のアプリケーションで問題なく機能します。ただし、単体テストは失敗します
TypeError: can't convert nil into String
/Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `initialize'
/Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `open'
/Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `from_file'
その理由は、単体テストのコンテキストでモデル メソッドが呼び出されると、画像データを含むオブジェクトopen(self.public_filename)
が返されるためです。このオブジェクトのメソッドが戻っStringIO
て爆発します。path
nil
MiniMagick::Image.from_file
このまったく同じモデル メソッドが から呼び出されると、 は、eg という名前のファイルに関連付けられたインスタンスPhotosController
をopen(self.public_filename)
返します。このファイルには画像データが含まれています。FileIO
/tmp/open-uri7378-0
テスト環境と開発環境の違いが原因かと思い、開発環境でコンソールを立ち上げてみました。しかし、単体テストと同様に、ではなくopen('http://...')
を返しました。StringIO
FileIO
open-uri と関連するすべてのアプリケーション固有のコードをたどりましたが、違いの理由は見つかりません。