LoginSignup
5
4

More than 5 years have passed since last update.

Carrierwave、paperclipを使った時のテストでコケた!

Last updated at Posted at 2016-02-11

carrierwaveやpaperclipを使って画像アップロードを実装して、いよいよ最後にテストコードを書こうとなりまして。以下のように書いてハマってしまったのでメモ。
avatarにはpresence: trueのバリデーションを設定しています。

spec/support/factories/users.rb
FactoryGirl.define do
  factory :user do
    password = FFaker::Internet.password(8)
    name { FFaker::Name.name }
    email { FFaker::Internet.email }
    password password
    password_confirmation password
    avatar { FFaker::Avatar.image }
  end
end

こう書くと、バリデーションエラーを起こしてしまい、上手く画像ファイルが作られません。
コンソールでFFaker::Avatar.imageとたたくと、次のような画像urlになっているので画像ファイルに変換する必要があります。
"https://robohash.org/etsolutavero.png?size=300x300"

対処法

ActionDispatch::TestProcess という便利なモジュールが準備されているのでまずはこちらをインクルードします。
すると、fixture_file_upload というメソッドが使えるようになるので、こちらを使います。このメソッドはテスト用にアップロードされた状態の画像ファイルを生成してくれます。
これを使ってimage直下に配置した画像を指定しました。

spec/support/factories/users.rb
include ActionDispatch::TestProcess
FactoryGirl.define do
  factory :user do
    password = FFaker::Internet.password(8)
    name { FFaker::Name.name }
    email { FFaker::Internet.email }
    password password
    password_confirmation password
    avatar { fixture_file_upload("spec/support/image/noimage.png", 'image/png') }
  end
end

これで画像ファイルをアップロードした状態でテストユーザーが作成されて上手くテストが通ります。

他になにか良いやり方があれば教えて下さい。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4