Kuni-Blog

Webエンジニア目指して勉強中/RUNTEQ 5月生/Ruby on Rails/沖縄出身/23歳

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メソッドに修正しました。

しかし、テストを実行すると、以下のように失敗します。 f:id:originals_92:20200811144047p:plain

原因を探してみたところ、ApplicationHelperを読み込んでいなかったのでメソッドが使えないようでした。

spec/rails_helper.rb

require 'spec_helper'
  ...
RSpec.configure do |config|
  ...
  config.include ApplicationHelper  #追加
end

config.include ApplicationHelperを追加すると、short_timeメソッドが使えるようになり、テストが成功しました。



参考文献

qiita.com



以上です。最後まで読んでいただきありがとうございます。