CarrierWaveのremote_file_urlをwebmockでstub_requestする

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'},
  )
タイトルとURLをコピーしました