switch_to_window(windows.last)・strftimeメソッド・traitをletで呼び出す

switch_to_window(windows.last)

以下のテストコードを実行したところエラーが発生

describe 'Task一覧' do
  context '正常系' do
    it 'Project詳細からTask一覧ページにアクセスした場合、Taskが表示されること' do
      project = FactoryBot.create(:project)
      task = FactoryBot.create(:task, project_id: project.id)
      visit project_path(project)
      click_link 'View Todos'
      expect(page).to have_content task.title
      expect(Task.count).to eq 1
      expect(current_path).to eq project_tasks_path(project)
    end
  end
end

エラー内容

Failure/Error: expect(page).to have_content task.title
       expected to find text "Task" in "Name: fugit\nStatus: doing\nRelease date: 2019-10-19\nView Todos\nEdit | Back"

task.title呼び出される"Task"がページに表示されていないとのこと。

view側でView Todosがどのように実装されているかを見にいくと、
以下のようになっており、ページが別タブで表示されていることが分かった。

<%= link_to 'View Todos', project_tasks_path(@project), target:'_blank', rel: 'noopener' %>


テストコードにswitch_to_window(windows.last)を加えて解決。

describe 'Task一覧' do
  context '正常系' do
    it 'Project詳細からTask一覧ページにアクセスした場合、Taskが表示されること' do
      project = FactoryBot.create(:project)
      task = FactoryBot.create(:task, project_id: project.id)
      visit project_path(project)
      click_link 'View Todos'
      switch_to_window(windows.last)
      expect(page).to have_content task.title
      expect(Task.count).to eq 1
      expect(current_path).to eq project_tasks_path(project)
    end
  end
end

switch_to_window(windows.last)で最後に開いたタブに移動できる。

strftimeメソッド

日時データの表示を好きなように設定できるメソッド

Time.current.strftime('%Y-%m-%d')
=> "2020-12-01"

Time.current.strftime('%m/%d %H:%M')
=> "12/01 17:08"

書式一覧 Time#strftime (Ruby 2.7.0 リファレンスマニュアル)

traitをletで呼び出す

traitを定義

#spec/factories/tasks.rb

FactoryBot.define do
  factory :task do
    title { 'Task' }
    status { rand(2) }
    from = Date.parse("2019/08/01")
    to   = Date.parse("2019/12/31")
    deadline { Random.rand(from..to) }
    association :project

    trait :done do
      status { :done }
      completion_date { Time.current.yesterday }
    end
  end
end


traitをletで定義し、テストコードで呼び出し

describe 'Task編集' do
  let(:task_done) { create(:task, :done, project_id: project.id) }

  it '既にステータスが完了のタスクのステータスを変更した場合、Taskの完了日が更新されないこと' do
    visit edit_project_task_path(project, task_done)
    select 'todo', from: 'Status'
    click_button 'Update Task'
    expect(page).to have_content('todo')
    expect(page).not_to have_content(Time.current.strftime('%Y-%m-%d'))
    expect(current_path).to eq project_task_path(project, task_done)
  end
end