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
これで画像ファイルをアップロードした状態でテストユーザーが作成されて上手くテストが通ります。
他になにか良いやり方があれば教えて下さい。