みんなの「作ってみた」

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

2019/05/02

ryoutaku
ryoutaku
2018年12月から3年間「毎日技術ブログ書く」と宣言して現在も継続中。IBMのWatsonきっかけでエンジニアに憧れて、28歳未経験で転職。バックエンドの開発を担当(Ruby,AWS)社会にインパクトを与えるプロダクトの開発に携わりたい一心で、愚直にアウトプットを継続。今の関心事は自然言語処理。

概要

今回は、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日目:検索機能〜いいね機能の実装