Rails
ActionMailer
ActiveJob

system testでdeliver_later実行時にSerializationError

RailsのactionMailerでdeliver_laterする際、ブラウザから操作した場合は問題ないのにsystem test時に下記のエラーが発生。

ActiveJob::SerializationError: Unsupported argument type: Time

rspecかcapybaraかと思ったら、activeJobのバグと、ActionMailerに渡しているmockの書き方が原因だった。

myMailer.myMethod(params).deliver_later

paramsはAPIで取得するJSONをparseしたハッシュのため、テストの場合はmockにしていたが、TimeWithZone型をそのまま突っ込んでいた。

これをstringにすることで解決。

参考

- Mail and deliver_later doesn't work with date argument · Issue #18519 · rails/rails

- ActiveJobの引数にはなんでも突っ込んでいいわけではない - Qiita