LoginSignup
70

More than 3 years have passed since last update.

画像アップロード CarrierWaveを使ったmodelのRSpecを通す

Last updated at Posted at 2017-06-14

備忘録です。
今まで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と同じ書き方です。

spec/factory/book.rb
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を用意して行きます。

spec/book_spec.rb
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上で書いた場合はカバレッジ計測確認済です。

困った方はぜひ試してみてください。

ではでは。

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
70