2017-09-19 1 views
0

Ich habe einen Endpunkt in meiner Sinatra-Anwendung, die binäre Daten als Teil des Körpers erhalten wird. Die andere Anwendung es das Senden von Daten wird eine Faraday Anfrage hat, die wie folgt aussieht:Eine Post-Anfrage mit Binärdaten in Sinatra verspotten

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 

Dann in Sinatra, werde ich einen Endpunkt hat, die diese Anforderungsparameter und binäre Daten empfangen und übergibt sie an ein Modell, wie so:

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 

Wenn ich versuche, diesen Endpunkt zu testen Rack::Test Helfer verwenden, habe ich am Ende in einer seltsamen Situation auf. Ich kann anscheinend nicht den richtigen Mock erstellen, um diesen Endpunkt richtig zu testen. Aufgrund einiger manueller Tests mit PostMan bin ich mir ziemlich sicher, dass mein Endpunkt ordnungsgemäß funktioniert. Es ist nur der Test, der mich aufhält. Hier ist die Spezifikation:

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 

Und wenn ich prüfen, was die eingehende Anforderung sieht aus wie im Test, ist es nicht einen richtigen Körper enthalten. params ist richtig auf die host und verification Einstellungen eingestellt, die ich eingestellt habe, aber der Körper wird auch auf die Parameter (inspiziert durch payload = request.body.read) statt der binären eingestellt.

Gibt es eine andere Möglichkeit, den Mock so einzurichten, dass die Binärdatei korrekt auf den Hauptteil der Anfrage gesetzt wird und die Parameter immer noch korrekt auf die Anfrageparameter gesetzt sind?

Antwort

0

Die Antwort ist, dass die einzige Möglichkeit, den Körper zu veröffentlichen ist, wo ich die Params in den Rack-Test-Helfer hinzugefügt wurde. Ich musste die params nehmen und sie in die Abfragezeichenfolge der URL in der Anfrage verschieben, und dann nur die binäre als die body der Anforderung post in der Testhilfe hinzufügen.

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