概要
ファイルアップロードを含む API 通信を Faraday で実装して、 VCR でテストしていた時に、初回のテストは通ったが2回目以降のテスト実行で VCR::Errors::UnhandledHTTPRequestError で落ちた。
既に cassette が存在する場合、リクエストの body との一致まで確認する設定にしている場合、 body 中の boundary は毎回異なるため、2回目以降のテスト実行が落ちてしまう。
気付けば何ということのない話だが、汎用的なエラーメッセージしか出ないと同じリクエストをしようとしているはずなのだけど、と言う先入観に囚われて少し詰まったので記録。
暫定的な回避策
該当の RSpec ファイル中での VCR の default_cassette_options を変更して body の確認をしないようにした。
VCR.config do |c|
# 全体設定ファイルでは match_requests_on: [:method, :uri, :body] としていた
c.default_cassette_options = { record: :once, match_requests_on: [:method, :uri] }
end
これでテスト実行時に作成されるリクエスト中の body が記録した cassette と一致しなくても呼び出されるためテストが通る
もうちょっとまともな対応をしたい場合
一応それっぽい記事を見つけたのだが、面倒臭そうなので実際には対応していない。恐らく以下の記事を参考にすれば boundary の差分以外を除外したものを比較する対応ができる。
https://www.kabisa.nl/tech/matching-multipart-request-bodies-with-vcr/