0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails] Rspec ポートフォリオに実装したsystem spec

Posted at

はじめに

ポートフォリオに実際に実装したsystem specの部分です。
テストコードについては勉強したけどテストコードを実際に書く時にどんなことをテストすればいいか分からないと思ったのでそういった人の参考になれば嬉しいです。
テストしたのは投稿機能部分です。

イベント投稿

spec/system/event_spec.rb
require 'rails_helper'

RSpec.describe "Event",js: true ,type: :system do
  let(:user) { create(:user) }

  describe "イベントの表示" do
    let!(:events) { create_list(:event, 3) }
    subject { visit root_path } 
    it "イベント一覧を表示できる" do
      subject
      events.each do |event|
        expect(page).to have_css(".card-title", text: event.name)
      end
    end

    it "イベント詳細を表示できる" do 
      subject
      event = events.first
      click_on event.name
      expect(page).to have_css(".event-title", text: event.name)
      expect(page).to have_css(".card-text", text: event.text.to_plain_text)
    end
  end

  describe "イベント投稿" do
    context "ログインしている場合" do
      before do
        sign_in user
      end

      it "イベントを投稿できる" do 
        visit new_event_path 
        event = FactoryBot.create(:event, name: "name", text: "text")
        fill_in "イベント名", with: event.name
        fill_in_rich_text_area "イベント詳細", with: event.text

        click_button "作成する"

        expect(page).to have_content name
        expect(page).to have_content text
      end

      it "nameが未入力だとイベント投稿できず投稿ページにリダイレクトされる" do 
        visit new_event_path 
        event = FactoryBot.create(:event, name: "name", text: "text")
        fill_in  "イベント名", with: ""
        fill_in_rich_text_area "イベント詳細", with: event.text
        click_button "作成する"

        expect(current_path).to eq new_event_path 

      end
    end

    context "ログインしてない場合" do 
      it "イベント投稿を押すとログイン画面に遷移する" do 
        visit root_path
        click_on "イベント作成"

        expect(current_path).to eq new_user_session_path
      end
    end
  end

end 

解説

Capybaraのfill_inメソッドを使うことでフォームに値を入力、click_buttonメソッドで投稿ボタンを押すことで投稿できるかのテストをしています。

spec/system/event_spec.rb
    it "イベントを投稿できる" do 
      visit new_event_path 
      event = FactoryBot.create(:event, name: "name", text: "text")
      fill_in "イベント名", with: event.name
      fill_in_rich_text_area "イベント詳細", with: event.text

      click_button "作成する"

      expect(page).to have_content name
      expect(page).to have_content text
    end

nameにpresence: trueのヴァリデーションを設定してるので投稿出来ず同じページにリダイレクトされるテストです。

spec/system/event_spec.rb
    it "nameが未入力だとイベント投稿できず投稿ページにリダイレクトされる" do 
      visit new_event_path 
      event = FactoryBot.create(:event, name: "name", text: "text")
      fill_in  "イベント名", with: ""
      fill_in_rich_text_area "イベント詳細", with: event.text
      click_button "作成する"

      expect(current_path).to eq new_event_path 

    end

fill_in_rich_text_areaというのは、今回投稿フォームにAction Textを使用しているのでAction Text内でもテストができるようにしたヘルパーです。
詳しくは以下の記事を参考にしてください。

以上です。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?