Help us understand the problem. What is going on with this article?

【10日間でポートフォリオ作成に挑戦】6日目:テストコードの実装

概要

今回は、2019年のGW期間(10日間)を全て費やして取り組むポートフォリオの製作過程を取りまとめた内容を投稿させて頂きます。(投稿は毎日行う予定)

全体通した取り組みの詳細については、前回までの記事をご参照ください。

【10日間でポートフォリオ作成に挑戦】1日目:要件定義〜記事投稿のCRUD
【10日間でポートフォリオ作成に挑戦】2日目:アクセス制限〜コメントのCRUD機能
【10日間でポートフォリオ作成に挑戦】3日目:ページネーション~CKEditorの導入
【10日間でポートフォリオ作成に挑戦】4日目:テーブル分割〜CKEditorのフォームへの反映
【10日間でポートフォリオ作成に挑戦】5日目:CKEditorへ画像アップロード機能を追加

今日一日の作業内容

ここからは、今日1日で取り組んだ作業内容をご説明します。

テストコードの記述

これまで実装した各機能のテストコードを記述して行きました。

  • アカウント認証機能(devise)
  • 記事のCURD機能(一覧、新規作成、編集、削除)
  • 記事へのコメントのCRUD機能(新規作成、編集、削除)
  • 記事一覧のページネーション(kaminari)
  • 画像のアップロード機能(Shrine)
  • CKEditorによる記事の編集機能

テストで利用したgemは下記の通りです。

group :development, :test do
(中略)
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'rails-controller-testing'
end

group :test do
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  gem 'chromedriver-helper'
end

なお、テストコードの実装にあたっては、Everyday Railsをかなり参考にさせて貰いました。
Everyday Rails - RSpecによるRailsテスト入門

今日の失敗

ここからは、今日の失敗をまとめます。

テストコードを通す為に無理矢理な処理を記述する

※追記(5/3):こちらのコードは、伊藤さん(@jnchito)がコメントにて、適切な修正案を提示して頂いているので、そちらもご参考にしてください。

まずは、下記のコードをご覧ください。

spec/system/post_spec.rb
require 'rails_helper'

RSpec.describe 'post_comment', type: :system do
  let!(:user) { create(:user) }
  let(:post) { create(:post, id: 1, user_id: 1) }
  let(:post_description) { create(:post_description, post_id: 1) }
  before { login_user(user) }

  it 'creates post' do
    visit posts_path
    click_on(I18n.t('common.button.new'))

    fill_in 'post[title]', with: 'テストタイトル1'
    fill_in 'post[post_description_attributes][description]', with: 'テスト詳細1'
    click_button(I18n.t('common.button.submit'))

    expect(page).to have_content('テストタイトル1', 'テスト詳細1')
  end

  it 'edits post' do
    post
    create(:post_description, post_id: 1)
    visit edit_post_path(post)

    fill_in 'post[title]', with: 'テストタイトル2'
    fill_in 'post[post_description_attributes][description]', with: 'テスト詳細2'
    click_button(I18n.t('common.button.submit'))

    expect(page).to have_content('テストタイトル2', 'テスト詳細2')
  end
end

上記のコードは二つの欠点があります。

I18n

辞書ファイルの名称と一致するかチェックしてsubmitボタンを押す処理ですが、下記の様にI18nを外すと、エラーになってしまいます。

click_button(t('common.button.submit'))
NoMethodError:
undefined method `t' for #<RSpec::ExampleGroups::Post:0x00007fb64b90cac8>

インターネットで調べると、stackoverflowに下記の様な回答があったので、それに沿って、I18nを付与すると、エラーは解消されました。

Use I18n.t instead of just t.
undefined method `t' for Admin::FaqsController:Class

しかし、I18n無しでも本来は実装出来るはずです。
その方法が見当たらなかった為、一旦この方法で実装しています。

editでのpostの定義

editアクションのテストにおいて、post_descriptionを新たに作成していますが、本来であれば、letで事前に作成しているはずなので、不要です。

しかし、このコードを外すとエラーになってしまいます。

Failures:

  1) post edits post
     Failure/Error: fill_in 'post[post_description_attributes][description]', with: 'テスト詳細2'

     Capybara::ElementNotFound:
       Unable to find field "post[post_description_attributes][description]" that is not disabled

こちらも原因が特定できませんでした、テストは正常にできている様なので、一旦はこの状態で実装し、後々対策を調査しようと考えています。

流石に疲れて来た

開発を進めながら、個人ブログとQiitaを両方毎日投稿するのは結構疲れます・・・
(特にQiitaは多く目に触れるので、かなり神経を擦り減らす・・・)

その影響で集中力が持続せず、作業効率がかなり落ちてしまっている様に感じます。
適宜息抜きも必要だと、改めて実感しました。

明日の予定

  • 記事の検索機能(ransack)
  • 記事へのいいね機能(別ユーザーのみ)
  • 記事のストック機能(自身の記事も可)

明日までにここを完成させないと、いよいよ後が無い・・・
デスマーチで乗り切るほかあるまい・・・

※追記:七日目を投稿しました
【10日間でポートフォリオ作成に挑戦】7日目:検索機能〜いいね機能の実装

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away