Help us understand the problem. What is going on with this article?

CarrierWaveを使いつつfixtures + minitestでtestを書く

More than 5 years have passed since last update.

なんかもうちょっといい方法がある気がするんですが、これで一応通りました。

準備

app/models/user.rb
class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
  validates :avatar, presence: true # ファイルがちゃんと設定されていることを確認
end

やり方

app/uploader/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
  #...
  def store_dir
    return '' if Rails.env.test?
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  #...
end
test/fixtures/users.yml
<% file_path = Rails.root.join('test/fixtures/files') %>
user_with_avatar:
  avatar: <%= file_path.join('avatar.png') %>
# test/fixtures/files 配下にavatar.pngを置いておく
test/test_helper.rb
class ActiveSupport::TestCase
  #...
  # Not storing uploads in the tests
  CarrierWave::Mount::Mounter.class_eval { def store!; end }
  CarrierWave.root = Rails.root.join('test/fixtures/files')

  def after_teardown
    super
    CarrierWave.clean_cached_files!(0)
  end
  #...
end
test/model/user_test.rb
class UserTest < ActiveSupport::TestCase
  test 'レコードが作成できること' do
    #...
    file_dir = Rails.root.join('test/fixtures/files/')
    File.open(file_dir.join('avatar.png')) do |image|
      #...
      user.avatar = image
      user.save!
    end
    #...
  end
end

参考記事

Using Rails test fixtures with CarrierWave

kazasiki
IT企業に務めるプログラマ。ITとゲームとハードコアテクノをこよなく愛してます。クラブによく出没します。Youtube等でゲーム実況してます。IT系の勉強会とかよく行きます。 Ruby/C/C++/Python/Go/機械学習/Rails
http://kazasikipg.hatenablog.com/
persol
PERSOL(パーソル)グループは、人材派遣、人材紹介、求人広告をはじめとし、ITアウトソーシング、設計開発にいたるまで、国内外70社を超える幅広い企業群で構成されています。
https://www.persol-group.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away