Rails Diary

プログラミングの学習記録です。

RSpecメモ(3)

letを使う

let(:project) { create(:project) }
let!(:task) { create(:task, project_id: project.id) }

FactoryBotのファイルにprojectとのアソシエーションを記載すれば、テストデータ作成の際にproject_idを記載しなくても良いものと思っていたけれど、上手く行かなかったのでproject_idも記載
※ 遅延するletとitの前に作成してくれるlet!の使い所に注意

別ダブを開く時のテスト

projectの詳細画面に遷移し、task一覧へのリンクをクリックすると別タブが開かれる仕様。別タブを開く記載switch_to_window(window.second)がないためテストが失敗していた。

RSpecのテストで別タブをテストする方法 - study-outputの日記

visit project_path(project)
click_link 'View Todos'

switch_to_window(window.second) # 追加

expect(page).to have_content task.title
(省略)

click_linkやclick_buttonの後に記載、最後に開いたタブに移動する場合はwindow.last、次に開いたタブに移動する場合はwindow.secondを記述する。

日付表示

expect(find('.task_list')).to have_content(Time.current.strftime('%Y-%m-%d')) # 削除
expect(find('.task_list')).to have_content(Time.current.strftime('%-m/%d %-H:%M'))  #編集

時刻をformat文字列に従って文字列に変換した結果を返します。 strftimeメソッド

実際のビュー画面とdeadlineの表示がことなっていたので変更

しかしこの書き方だと、Viewファイルの仕様が変わった時にこのままのテストで対応できなくなってしまう模様。

RSpecの日付表示を、viewで使っているメソッドに合わせて修正 - Kuni-Blog、こちらのサイトを同じ状態だった。

viewファイルで使っているヘルパーメソッドを用いてテストも書き換えるのが望ましい。

<!-- app/views/tasks/index.html.erb -->
<td><%= short_time(task.deadline) if task.deadline? %></td>
expect(find('.task_list')).to have_content(short_time(Time.current))

↑のような形で記述する

さらにこのままだとshort_timeを使ったことでNo methodエラーが出てしまうので、rails_helper.rbにApplicationHelperの読み込みを記載する。

# spec/rails_helper.rb
RSpec.configure do |config|
  config.include ApplicationHelper
end
この記載により、RSpecでもヘルパーを用いることができる。