非同期コメント投稿機能の結合テストが中々通らなかった話


開発環境

Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系

前提

非同期でコメント投稿機能実装済み
Commentモデルの単体テストは実行済み
FactoryBotやFakerはインストール済み

ことの発端

オリジナルアプリの結合テストを書いていたところ、「コメントを送信すると、Commentモデルのカウントが1上がることを確認する」というexampleの記述が引っ掛かりエラーになってしまった。

comments_spec.rb
# コメントを送信すると、Commentモデルのカウントが1上がることを確認する
    expect{
      find('input[name="commit"]').click
    }.to change {Comment.count}.by(1)

エラー文

原因

エラー文を見る限りどうやら、Comment.countが増えていないようでした。

送信自体ができていないわけではなく、原因のexampleを抜いてテストコードを実行すると、下記のexampleは正常に通りました。

comments_spec.rb
# 詳細ページ上に先ほどのコメント内容が含まれていることを確認する
    expect(page).to have_content(@comment)

解決法

おそらく非同期でコメント投稿機能を実装したので、モデルのカウントが上がっていないのだろうと推測しました。
そのため、ページをリロードする記述を追加し、以下のようにテストコードを編集しました。

comments_spec.rb
  # コメントを送信すると、Commentモデルのカウントが1上がることを確認する
    find('input[name="commit"]').click
    expect{
      visit current_path
    }.to change {Comment.count}.by(1)

この結果無事テストコードは通りました。

調べましたが、Ajax関連のテスト方法はいろんな手法があるみたいですね。
この方法が正しいのかはわかりませんが、一つの手段として参考になれば幸いです。