flashメッセージが時々表示されないflakyテストを改善した話

Railsで

  • cookie sessionを使っている
  • 非同期でAPIをよく叩いている

という条件下で、例えば日報を投稿したあとに"投稿しました!"というflashメッセージを表示しているはずなのになぜか"投稿しました!"が表示されないという現象が時々起こっていました。

これは次のようなことが原因だと推測しています。

  • 非同期API(例: 日報のプレビューを表示する)が実行される
  • 日報投稿ボタンを押す
  • 投稿が成功して日報詳細ページへのリダイレクト用のレスポンスが返される
    • SetCookiesでflashメッセージを含んだcookie sessionが返される
  • 非同期APIのレスポンスが返る
    • SetCookiesでflashメッセージを含まないcookie sessionが返される
  • 日報詳細ページへのリクエストが実行される
    • このとき送信するCookieにはflashメッセージが含まれていないので"投稿しました!"は表示されない

長らくこの問題に悩まされていたのですが、API実行時は次のようにしてSetCookiesヘッダを返さないようにするという方法を思いついたので試してみました。おそらくこれで解決するはず。

class Api::BaseController < ApplicationController
  class NullCookieJar < ActionDispatch::Cookies::CookieJar
    def write(*)
      # nothing
    end
  end

  before_action :null_cookies

  def null_cookies
    request.cookie_jar = NullCookieJar.build(request, {})
  end
end