LoginSignup
3
3

More than 3 years have passed since last update.

ActiveStorageを導入した時のimageカラムのテストコード

Posted at

初心者の私がactivestorageを使ったときのテストコードで1時間ほど詰まったのでその備忘録です

まず前提として、必要なactivestorageやfactorybot、specのインストールは済ませているものとします。

済ませていなければ以下のgemをgemfileに記述しbundle installしましょう
その後RSpecのインストールをしましょうrails g rspec:install

gemfile
group :development, :test do   

  gem 'rspec-rails'         #この3行を記述、テストをするためのgem
  gem 'factory_bot_rails'   #この3行を記述、テスト用のテンプレートを作成するためのgem
  gem 'pry-rails'           #この3行を記述、bindind.pryを実行するためのgem

  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
ターミナル
% bundle install
% rails g rspec:install

まずpublicのディレクトリ下にimagesと言うファイルを作成する
そのimagesの中に適当な画像のデータを保存する(今回はa.pngと言う名前の画像を用意します)

今このような状態
public/images/a.png

a.pngは適当な画像のデータです

次にそのデータを参照したいのでfactoriesディレクトリの中にあるテンプレートの中にimageカラムを作成します今回私は「item」と言うモデルをテストするのでractories/items.rbになります

ractories/items.rb(モデル名.rb)
FactoryBot.define do
  factory :item do
    name                 {"名前"}
    price                {500}
    text                 {"テスト"}
    judgement_id         {1}
    category_id          {1}
    prefecture_id        {2}
    day_id               {1}
    status_id            {1}

    user    #userとのアソシエーション

    after(:build) do |message|
      message.image.attach(io: File.open('public/images/a.png'), filename: 'a.png')
    end

  end
end

ゆるく解説

・judgement_idやcategory_idなどの「_id」の項目はactivehashを使って導入したので無視して大丈夫です。

・userと言う記述はuserモデルとのアソシエーションを意味してます、これを記述することでuser_idを入力しなくてすみます。

今回の注目していただきたいのはuserの下にある記述です

ractories/items.rb(モデル名.rb)
after(:build) do |message|
      message.image.attach(io: File.open('public/images/a.png'), filename: 'a.png')
    end

この記述により実際に存在する写真を参照するようになります。

ダメな例

ractories/items.rb(モデル名.rb)
FactoryBot.define do
  factory :item do
    name                 {"名前"}
    price                {500}
    text                 {"テスト"}
    judgement_id         {1}
    category_id          {1}
    prefecture_id        {2}
    day_id               {1}
    status_id            {1}
    image                {"a.png"}    #ダメな例です

    user
  end
end

こうしてしまうと、文字列しか登録できていないため、エラーになりますちなみにエラー内容は以下になります。
エラーを確かめたい場合はbinding.pryを記述して処理を止めましょう!

ターミナル
[1] pry(#<RSpec::ExampleGroups::Item>)> @item.valid?
ActiveSupport::MessageVerifier::InvalidSignature: ActiveSupport::MessageVerifier::InvalidSignature

同じエラーに出会した方の参考になれば幸いです。

3
3
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
3
3