RSpecの日付表示を、viewで使っているメソッドに合わせて修正
こんにちは、くになかです。
RSpecを学習したときに詰まったので、忘れないように書き残しておきます。
はじめに
実装途中のRSpecでテストが失敗するので、修正を行いました。
spec/system/task_spec.rb
it 'Taskを編集した場合、一覧画面で編集後の内容が表示されること' do visit edit_project_task_path(project, task) fill_in 'Deadline', with: Time.current click_button 'Update Task' click_link 'Back' expect(find('.task_list')).to have_content(Time.current.strftime('%Y-%m-%d')) expect(current_path).to eq project_tasks_path(project) end
上記のテストを実行した際に、時刻表示の実装が違ってたのでテストが失敗していました。
行ったこと
最初に修正を行った時は、日付の表示でテストが失敗していたので、表示形式を変更しました。
spec/system/task_spec.rb
it 'Taskを編集した場合、一覧画面で編集後の内容が表示されること' do visit edit_project_task_path(project, task) fill_in 'Deadline', with: Time.current click_button 'Update Task' click_link 'Back' # 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')) #追加 expect(current_path).to eq project_tasks_path(project) end
このままでもテストは成功するのですが、strftimeで直接書き換えると、View側の表示の仕様が変わるとテストが失敗してしまいます。
なので、Viewで使用しているメソッドを使って変更する必要があります。
app/view/tasks/index.html.erb
<% @tasks.each do |task| %> <tr> <td><%= task.title %></td> <td><%= task.status %></td> <td><%= short_time(task.deadline) if task.deadline? %></td> <td><%= link_to 'Show', [@project, task] %></td> <td><%= link_to 'Edit', edit_project_task_path(@project, task) %></td> <td><%= link_to 'Destroy', [@project, task], method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %>
viewではshort_timeメソッドを使っているので、それを使って修正します。
spec/system/task_spec.rb
it 'Taskを編集した場合、一覧画面で編集後の内容が表示されること' do visit edit_project_task_path(project, task) fill_in 'Deadline', with: Time.current click_button 'Update Task' click_link 'Back' # expect(find('.task_list')).to have_content(Time.current.strftime('%-m/%d %-H:%M')) expect(find('.task_list')).to have_content(short_time(Time.current)) #追加 expect(current_path).to eq project_tasks_path(project) end
上記のように、strftimeメソッドからviewで使ってるshort_timeメソッドに修正しました。
しかし、テストを実行すると、以下のように失敗します。
原因を探してみたところ、ApplicationHelperを読み込んでいなかったのでメソッドが使えないようでした。
spec/rails_helper.rb
require 'spec_helper' ... RSpec.configure do |config| ... config.include ApplicationHelper #追加 end
config.include ApplicationHelperを追加すると、short_timeメソッドが使えるようになり、テストが成功しました。
参考文献
以上です。最後まで読んでいただきありがとうございます。