2017-12-31 41 views
1

Ktor (kotlin web framework) hat einen tollen Testmodus, in dem HTTP-Anfragen in Unit-Tests verpackt werden können. Sie geben ein schönes Beispiel dafür, wie man einen GET-Endpunkt testet here, , aber ich habe Probleme mit einem HTTP-POST.Testen von Anfragen in Ktor

Ich versuchte dies aber die Post params scheinen nicht auf die Anfrage hinzugefügt werden:

@Test 
fun testSomePostThing() = withTestApplication(Application::myModule) { 
    with(handleRequest(HttpMethod.Post, "/api/v2/processing") { 
     addHeader("content-type", "application/x-www-form-urlencoded") 
     addHeader("Accept", "application/json") 
     body = "param1=cool7&param2=awesome4" 
    }) { 
     assertEquals(HttpStatusCode.OK, response.status()) 
     val resp = mapper.readValue<TriggerResponse>(response.content ?: "") 
     assertEquals(TriggerResponse("cool7", "awesome4", true), resp) 
    } 
} 

Wer irgendwelche Ideen?

Antwort

1

Ok stumm Fehler, ich werde es hier posten, falls dies spart jemand anderes von Zeit zu verschwenden;) Die Unit-Test tatsächlich wurde ein echtes Problem zu kontrollieren (das ist, was sie sind, denn ich denke) In meinem Routing I wurde verwendet:

install(Routing) { 
     post("/api/v2/processing") { 
      val params = call.parameters 
      ... 
     } 
} 

Allerdings funktioniert das nur für 'Get' Params. Post-Parameter benötigen:

install(Routing) { 
     post("/api/v2/processing") { 
      val params = call.receive<ValuesMap>() 
      ... 
     } 
} 
0

call.parameters funktioniert auch für Post-Routen.

get("api/{country}") { 
    val country = call.parameters["country"]!! 
    ... 
} 

Dies wird Ihnen geben, was in der URI nach API übergeben wird.

call.receive ist für den Körper einer Anfrage.