備忘録です。
今までActionDispatchを使ってRSpecで画像アップロードのテストを行っていたのですが、今回はCarrierWaveを使っていたのでmodelを通さなければいけない、createアクションで画像アップロードのテストをしたいと思ったので、試しにやってみました。
書き方はGitHubのwikiにありましたのでこちらを参考にしました。
URL: https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Use-test-factories
動作環境
- Mac OSX EI Capitan 10.11.6
- Ruby 2.3.4
- Rails 5.1.1
FactoryGirl上で用意する
まずはbookモデルに対してFactoryで画像を用意する場合です。
こちらは参考にしたGitHubと同じ書き方です。
FactoryGirl.define do
factory :book, class: Book do
id '1'
title 'たのしいRuby'
content 'ここが内容です'
image Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec/fixtures/image.jpg'))
created_at '2016-01-01T00:00:00Z'
updated_at '2016-01-02T00:00:00Z'
end
end
spec/fixture
配下の画像ファイルを用意している前提です。ここではimage.jpg
を読み込んでいます。
作成した上記のfactoryをspec上で呼び出せばCarrierWaveで用意したImageUploaderモデルのカバレッジは通ると思います(未検証)。
spec上で用意する
specのcreateアクションに対して用意する場合です。
createなので基本的にはfactoryを用いずに直打ちでletを用意して行きます。
describe 'POST create' do
let(:image_path) { File.join(Rails.root, 'spec/fixtures/image.jpg') }
let(:image) { Rack::Test::UploadedFile.new(image_path) }
.
.
before do
post :create, params: {
book: {
.
.
image: image
}
}
end
.
.
.
こんな感じでいけます。
before
以下は別として遅延評価let
で用意するところだけを見れば良いです。
createする際にlet
で用意したimageを渡してあげればImageUploaderのカバレッジは通ります。
spec上で書いた場合はカバレッジ計測確認済です。
困った方はぜひ試してみてください。
ではでは。