CarrierWaveでremote_file_urlの部分をテスト(rspec)する場合、remote_file_urlのurlをwebmockでstub_requestして、通信せずにローカルに用意した画像を参照させたい。
例えば、remote_file_urlがhttps://example.com/icon.png
の場合、ローカルのspec/images/icon.png
を参照させるというケース。
そういうとき、特に調べもせず、次のように書いてみたら失敗した。
stub_request(:get, 'https://example.com/icon.png')
.to_return(
status: 200,
body: Rails.root.join('spec/images/icon.png').open,
)
何が失敗かというと、これを含めたテストを実行してみたら、モデルを保存するときにエラーが発生したのである。
ActiveRecord::RecordInvalid:
バリデーションに失敗しました: File( jpg, jpeg, gif, png )形式以外のファイルをアップロードすることはできません
いやいやいや、用意したicon.pngは確かにpng画像ですから!
と、文句を言ってもしょうが無いので、CarrierWaveが何を基準にファイル形式のバリデーションしているか確認した。
その結果、どうやらContent-Type
ヘッダを見ているようだった。
なので、次の用にヘッダを追加したら解決しました。
stub_request(:get, 'https://example.com/icon.png')
.to_return(
status: 200,
body: Rails.root.join('spec/images/icon.png').open,
headers: {'content-type': 'image/png'},
)