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?