KonifarPod

CarrierWaveを使っているModelをRSpecでテストする方法

   

Pocket

画像アップロード機能をRailsで実現する場合、CarrierWaveを利用しているプロジェクトは多いのではないでしょうか?CarrierWaveの使い方についてはQiitaのこちらの記事にまとまっています。

ModelのプロパティにImageUploderを定義するだけで利用できるのですが、RSpecでテストをする場合、内部でエラーが発生して落ちてしまうことがあります。

[model]

class ImageTest < ActiveRecord::Base
  mount_uploader :image, ImageUploader
  attr_accessible :image
end

[rspec]

require 'spec_helper'
describe TourComment do
  describe '#create' do
    subject { ImageTest.create(:image => 'test.jpg') }
    it { should_not be_nil }
end

[error_message]

TypeError:
 can't convert nil into String
 # ./app/uploaders/image_uploader.rb:8:in `+'
 # ./app/uploaders/image_uploader.rb:8:in `url'
 ・・・

この問題を解消するには、imageUploaderを定義したプロパティにファイルを渡すようにrspecを修正してやる必要があります。事前に適当なディレクトリにテスト用の画像ファイルを置いておきましょう。下の例では、spec/fixtures/files/test.jpg を配置しています。

[rspec]

require 'spec_helper'
describe TourComment do
  describe '#create' do
    subject { ImageTest.create(:image => File.open(File.join(Rails.root, '/spec/fixtures/files/test.jpg'))) }
    it { should_not be_nil }
end

これでテストが通るようになります。

もしかしたらstubを使ってもっとうまくやる方法があるのかもしれませんが、色々試してみてこの方法に落ち着きました。いい方法があれば教えていただけると助かります!

Pocket

 - Develop , ,