Ruby / Rails

[Rails]RSpecで画像投稿機能( CarrierWave)のモデルのテスト方法

2019年9月9日

こんにちは、Nanayakuです。

今回は、RSpecで画像投稿機能(CarrierWave)のテストを行う方法について解説します。

画像アップロード CarrierWaveを使ったmodelのRSpecを通す - Qiitaを参考に説明しますが、自分は「factory_bot_rails」でuserのみ、ダミーを作成した状態で解説します。

目次

userの作成

Gemfileに「gem "factory_bot_rails"」を追記し、bundle installします。

その後、下記のコマンドでダミーuserを作るためのファイルを作成します。

$ rails g factory_bot:model user

自分は以下のダミーを作成しました。

FactoryBot.define do
  factory :user do
    sequence(:name) { |n| "test_name#{n}"}
    sequence(:email) { |n| "test#{n}@example.com"}
    sequence(:password) {"password1234"}
    sequence(:password_confirmation) {"password1234"}
  end
end

 

topicの作成

「spec/models/topic_spec.rb」にテストを書いていきます。

自分は画像のような関連付けでDBを作成しました。

まず、userとmicropost(ツイート)を作成しておきます。

RSpec.describe Topic, type: :model do
  before do
    user = FactoryBot.create(:user)
    micropost = Micropost.create(
      content: "test",
      user_id: user.id
      )
 end

次に、topic(画像)を作成します。

RSpec.describe Topic, type: :model do
  before do
    user = FactoryBot.create(:user)
    micropost = Micropost.create(
      content: "test",
      user_id: user.id
      )
    @topic = Topic.new(
      description: "test",
      image: ”  ”,
      micropost_id: micropost.id
      )
  end

ここのimageの書き方は、画像アップロード CarrierWaveを使ったmodelのRSpecを通す - Qiitaを参考に、

Rack::Test::UploadedFile.new(File.join(Rails.root, '画像ファイルがある場所のパス'))

となります。

上記の記事では、「spec/fixturesディレクトリ」に画像を用意していましたが、画像がある場所ならどこでも大丈夫です。

自分は、アプリケーションで使用していが画像を使用し、下記のようになりました。

RSpec.describe Topic, type: :model do
  before do
    user = FactoryBot.create(:user)
    micropost = Micropost.create(
      content: "test",
      user_id: user.id
      )
    @topic = Topic.new(
      description: "test",
      image: Rack::Test::UploadedFile.new(File.join(Rails.root, 'app/assets/images/figure_standing.png')),
      micropost_id: micropost.id
      )
  end

 

テストの作成

インスタンス変数に格納しているので、後は通常通りテストを書けば終了です。

  describe 'description,image,micropost_id' do
    context '全てに値が入っている場合' do
      it 'tureを返す' do
        expect(@topic).to be_valid
      end
    end
  end

 

最後に

今回自分は、「factory_bot_rails」を使いきれていなかったため、不恰好なテストコードになってしましました。

もっと良い書き方を調べたら、更新していこうと思います。

備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。

-Ruby / Rails
-

© 2024 Nanayaku blog Powered by AFFINGER5