こんにちは、Nanayakuです。
今回は、RSpecで画像投稿機能(CarrierWave)のテストを行う方法について解説します。
画像アップロード CarrierWaveを使ったmodelのRSpecを通す - Qiitaを参考に説明しますが、自分は「factory_bot_rails」でuserのみ、ダミーを作成した状態で解説します。
userの作成
Gemfileに「gem "factory_bot_rails"」を追記し、bundle installします。
その後、下記のコマンドでダミーuserを作るためのファイルを作成します。
1 |
$ rails g factory_bot:model user |
自分は以下のダミーを作成しました。
1 2 3 4 5 6 7 8 |
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(ツイート)を作成しておきます。
1 2 3 4 5 6 7 8 |
RSpec.describe Topic, type: :model do before do user = FactoryBot.create(:user) micropost = Micropost.create( content: "test", user_id: user.id ) end |
次に、topic(画像)を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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ディレクトリ」に画像を用意していましたが、画像がある場所ならどこでも大丈夫です。
自分は、アプリケーションで使用していが画像を使用し、下記のようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
テストの作成
インスタンス変数に格納しているので、後は通常通りテストを書けば終了です。
1 2 3 4 5 6 7 |
describe 'description,image,micropost_id' do context '全てに値が入っている場合' do it 'tureを返す' do expect(@topic).to be_valid end end end |
最後に
今回自分は、「factory_bot_rails」を使いきれていなかったため、不恰好なテストコードになってしましました。
もっと良い書き方を調べたら、更新していこうと思います。
備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。