2019/05/02
今回は、2019年のGW期間(10日間)を全て費やして取り組むポートフォリオの製作過程
を取りまとめた内容を投稿させて頂きます。(投稿は毎日行う予定)
全体通した取り組みの詳細については、前回までの記事をご参照ください。
【10日間でポートフォリオ作成に挑戦】1日目:要件定義〜記事投稿のCRUD
【10日間でポートフォリオ作成に挑戦】2日目:アクセス制限〜コメントのCRUD機能
【10日間でポートフォリオ作成に挑戦】3日目:ページネーション~CKEditorの導入
【10日間でポートフォリオ作成に挑戦】4日目:テーブル分割〜CKEditorのフォームへの反映
【10日間でポートフォリオ作成に挑戦】5日目:CKEditorへ画像アップロード機能を追加
ここからは、今日1日で取り組んだ作業内容をご説明します。
これまで実装した各機能のテストコードを記述して行きました。
テストで利用した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)がコメントにて、適切な修正案を提示して頂いているので、そちらもご参考にしてください。
まずは、下記のコードをご覧ください。
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
上記のコードは二つの欠点があります。
辞書ファイルの名称と一致するかチェックして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_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は多く目に触れるので、かなり神経を擦り減らす・・・)
その影響で集中力が持続せず、作業効率がかなり落ちてしまっている様に感じます。
適宜息抜きも必要だと、改めて実感しました。
明日までにここを完成させないと、いよいよ後が無い・・・
デスマーチで乗り切るほかあるまい・・・
※追記:七日目を投稿しました
【10日間でポートフォリオ作成に挑戦】7日目:検索機能〜いいね機能の実装