6

私はしばらくの間、webmock を使用してマルチパート リクエストをスタブ化しようとしてきましたが、満足のいく解決策が見つかりませんでした。

理想的には、次のようにリクエストをスタブしたいと思います。

stub_request(:post, 'http://test.api.com').with(:body => { :file1 => File.new('filepath1'), file2 => File.new('filepath2') })

しかし、これは機能していないようで、RSpec はリクエストがスタブ化されていないと文句を言います。スタブされていないリクエストが出力されます。

stub_request(:post, "http://test.api.com").
     with(:body => "--785340\r\nContent-Disposition: form-data; name=\"file1\"; filename=\"filepath1\"\r\nContent-Type: text/plain\r\n\r\nhello\r\n--785340\r\nContent-Disposition: form-data; name=\"file2\"; filename=\"filepath2\"\r\nContent-Type: text/plain\r\n\r\nhello2\r\n--785340\r\n",
          :headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Content-Length'=>'664', 'Content-Type'=>'multipart/form-data; boundary=785340', 'User-Agent'=>'Ruby'}).
     to_return(:status => 200, :body => "", :headers => {})

もちろん、境界は動的に生成されるため、この提案に従うことはできません。これらのリクエストを適切にスタブする方法はありますか?

ありがとう!ブルーノ

4

3 に答える 3

3

遅くなりましたが、将来のオーバーフロー者やグーグラーのために答えを残しておきます。

私は同じ問題を抱えており、Rack::Multipart::Parserを Webmock と組み合わせて回避策として使用しました。クイック アンド ダーティ コードは次のようになります (警告: アクティブ サポート拡張機能を使用します)。

stub_request(:post, 'sample.com').with do |req|
  env = req.headers.transform_keys { |key| key.underscore.upcase }
                   .merge('rack.input' => StringIO.new(req.body))
  parsed_request = Rack::Multipart::Parser.new(env).parse

  # Expectations:
  assert_equal parsed_request["file1"][:tempfile].read, "hello world"
end
于 2015-01-08T00:16:51.057 に答える
2

現在、WebMock はマルチパート リクエストをサポートしていません。詳細については、こちらの著者のコメントを確認してください: https://github.com/vcr/vcr/issues/295#issuecomment-20181472

次のいずれかのルートを検討することをお勧めします。

  • ポスト マルチパート ボディと一致しないスタブ
  • ファイルパス引数を使用してリクエストをメソッドにラップし、このメソッドによりきめ細かい期待値を設定する
  • 統合テストで外部リクエストをモックするための VCR の使用
于 2013-08-12T18:21:17.210 に答える