フォロー機能のテスト

今回は動画をフォローする機能を用いたものを結合テストする場合をの記述を記録します。

完成形

require 'rails_helper'

RSpec.describe "Relationships", type: :system do
  before do
    @user1 = FactoryBot.create(:user)
    @user = FactoryBot.create(:user)
    @game = Game.create(:game_title => 'マリオカート')
    @grade = Grade.create(:grades => '初級')
    @post = Post.create(:title => 'test', :youtube_url => 'IsXVebXtzwY', :content => 'test', :game_id => @game.id, :grade_id => @grade.id, :user_id => @user.id)
  end

   it 'フォローを実行解除することができる' do
    basic_pass root_path
    sign_in(@user1)
    visit post_path(@post.id)
    expect(page).to have_text('フォロー')
    click_on('follow-on')
    expect(page).to have_text('フォロー解除')
    click_on('follow-off')
    expect(page).to have_text('フォロー')
  end

  it '開いているユーザーが動画投稿者と同一であるとフォロー機能が見えずフォローを実行解除できない' do
    basic_pass root_path
    sign_in(@user)
    visit post_path(@post.id)
    expect(page).to_not have_text('フォロー')
  end
end

*こちらはモデル単体テストが成功している体で作成しており、未経験でもあるため、それを考慮して読んでいってください。

before do
    @user1 = FactoryBot.create(:user)
    @user = FactoryBot.create(:user)
    @game = Game.create(:game_title => 'マリオカート')
    @grade = Grade.create(:grades => '初級')
    @post = Post.create(:title => 'test', :youtube_url => 'youtubeのアカウント11桁', :content => 'test', :game_id => @game.id, :grade_id => @grade.id, :user_id => @user.id)
  end

まずはこの部分です。 今回はフォローをしていくためには、2つ以上のアカウントが必要があるため、@userと@user1を記述しています。 フォロー機能は動画を見る機能ごとにつけているため、動画を先に作成しておく必要があります。

it 'フォローを実行解除することができる' do
    basic_pass root_path
    sign_in(@user1)
    visit post_path(@post.id)
    expect(page).to have_text('フォロー')
    click_on('follow-on')
    expect(page).to have_text('フォロー解除')
    click_on('follow-off')
    expect(page).to have_text('フォロー')
  end

次にこの部分です。今回のテストに関してはフォローを実行したか判断するためにフォローに成功した時にフォロー解除に変化する使用であるため、フォロー解除が表示されているか確認するコード(expect(page).to have_text('フォロー解除'))を記述しています。 click_onに使用している部分に関しては()の中にhtml.erb記述しているidを書いています。

it '開いているユーザーが動画投稿者と同一であるとフォロー機能が見えずフォローを実行解除できない' do
    basic_pass root_path
    sign_in(@user)
    visit post_path(@post.id)
    expect(page).to_not have_text('フォロー')
  end

次に動画投稿者と開いているユーザーが同じ場合はフォローボタンがなくフォローできないということを確認するテストです。 expect(page).to_not を使用し、これがあると以降の文字列が存在しない場合はtrueを返す機能を果たし、今回の場合はフォローボタンが存在しない場合がテストが成功する仕様になっています。 今回は以上です。

基本的にテストで何を書けばどのようにテストしてくれるかを確認していくためには、公式ドキュメントを確認して、色々試してみることをお勧めします。ドキュメントは書いてあることが膨大で英語で探すのに苦労しますがもし何かをクリックするための機能を調べたいと思ったときにはcommand + F を使って、clickなどと入れてみるとclick関係の構文が出てくるので、それを試して行けばきっと答えに辿り行けると思います。