こんにちは、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」を使いきれていなかったため、不恰好なテストコードになってしましました。
もっと良い書き方を調べたら、更新していこうと思います。
備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。