2017-09-19 13 views
0

私はSinatraアプリケーションに、本体の一部としてバイナリデータを受け取るエンドポイントを持っています。 、そして、Sinatraでバイナリデータを使用してポスト要求を嘲笑

connection = Faraday.new(url: "https://example.com/post_data") do |conn| 
     conn.request :multipart 
     conn.adapter :net_http 
     conn.headers['Content-Type'] = 'octet/stream' 
    end 

    @response ||= connection.post do |req| 
     req.params = { :host => host, 
        :verification => "false"} 
     req.body = my_base64_encoded_binary 
    end 

シナトラに、私は次のように、これらのリクエスト・パラメータおよびバイナリデータを受信して​​、モデルに渡したエンドポイントを持つことになります。それにデータを送信し、他のアプリケーションでは、次のようになりファラデー要求を持っていますそう:私はRack::Testヘルパーを使用して、このエンドポイントをテストしようとすると

post '/post_data' do 
    request.body.rewind 
    payload = request.body.read 

    raise Sinatra::NotFound unless payload and params[:host] 
    output = MyOutput.new(params, payload) 

    content_type 'application/json' 
    body output.data 
end 

、私は奇妙な状況で終わります。このエンドポイントを適切にテストするために、適切なモックを作成できないようです。 PostManの手動テストに基づいて、私のエンドポイントが正しく動作するかどうかは確かです。それは私を抱きしめているテストです。

it "should return a json response" do 
    post(url, :host => host, :verification => "false") do |req| 
     req.body = [my_binary] 
     req.content_type = "application/octet-stream" 
    end 

    expect(last_response.status).to eq(200) 
    expect(last_response.content_type).to eq("application/json") 
    end 

また、受信したリクエストがテストでどのようになっているかを調べると、適切なボディが含まれていません。 paramsが正しくIセットhostverification設定に設定されているが、本体はまた、(payload = request.body.readを通して検査)paramsは代わりのバイナリに設定されています。

は、バイナリが適切にリクエストのボディに設定され、パラメータがまだ適切にリクエストパラメータに設定されているように、モックをセットアップするための別の方法はありますか?

答えて

0

答えは、身体を掲示する唯一の方法は、私がラックテストヘルパーにparamsを追加したところです。 paramsを取得し、要求のURLのクエリ文字列に移動してから、post要求のbodyというバイナリをテストヘルパーに追加するだけでした。

let(:url) { "http://example.com/post_data?host=>#{host}&verification=#{verification}" } 
    it "should return a json response" do 
    post(url, my_binary) 

    expect(last_response.status).to eq(200) 
    expect(last_response.content_type).to eq("application/json") 
    end 
関連する問題