Ich habe eine harte Zeit zu versuchen, meine API-Controller mit Visual Studio 2013 zu testen. Meine eine Lösung hat ein Web-API-Projekt und ein Test-Projekt. In meinem Test-Projekt habe ich eine Einheit Test mit diesem:Unit Testing/Integration Testing Web API mit HttpClient in Visual Studio 2013
[TestMethod]
public void GetProduct()
{
HttpConfiguration config = new HttpConfiguration();
HttpServer _server = new HttpServer(config);
var client = new HttpClient(_server);
var request = new HttpRequestMessage
{
RequestUri = new Uri("http://localhost:50892/api/product/hello"),
Method = HttpMethod.Get
};
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (var response = client.SendAsync(request).Result)
{
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
var test = response.Content.ReadAsAsync<CollectionListDTO>().Result;
}
}
Ich erhalte ein 404. Ich habe versucht, meine API mit einer Instanz von Visual Studio (IIS Express) auszuführen und zu versuchen, diesen Komponententest in einer anderen Instanz zu debuggen. Aber kein Glück. Ich habe überprüft, dass ich diese URL in einen Browser setzen kann (wenn ein Visual Studio debuggt) und ich meine JSON-Antwort sehe. Aber ich kann nicht herausfinden, wie man es mit meinem Komponententest und HttpClient
zur Arbeit bringt. Ich habe versucht, Beispiele online zu finden, kann aber keine finden. Kann jemand helfen?
UPDATE 1: Ich versuchte, eine Route hinzuzufügen, aber nichts passierte.
HttpConfiguration config = new HttpConfiguration();
// Added this line
config.Routes.MapHttpRoute(name: "Default", routeTemplate: "api/product/hello/");
HttpServer _server = new HttpServer(config);
var client = new HttpClient(_server);
[...rest of code is the same]
Hier ist mein API-Controller
[HttpGet]
[Route("api/product/hello/")]
public IHttpActionResult Hello()
{
return Ok();
}
UPDATE Auflösung: Ich war in der Lage, es zu bekommen zu arbeiten, wenn ich HttpClient
ohne HttpServer
Objekt neu auf. Ich würde immer noch zwei Instanzen von VS laufen lassen müssen. 1 mit meinem API-Code und ein anderer, um den Unit Test zu starten.
Hier ist eine Arbeitsmethode.
[TestMethod]
public void Works()
{
var client = new HttpClient(); // no HttpServer
var request = new HttpRequestMessage
{
RequestUri = new Uri("http://localhost:50892/api/product/hello"),
Method = HttpMethod.Get
};
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (var response = client.SendAsync(request).Result)
{
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
}
}
Wer weiß, warum es nicht mit einem HttpServer
funktioniert und ein HttpConfiguration
in HttpClient
weitergegeben? Ich habe viele Beispiele gesehen, die das verwenden.
vielleicht keinen Unterschied machen, aber warum verwenden nicht [GetAsync] (https://msdn.microsoft.com/en-us/ Bibliothek/hh158944 (v = vs.118) .aspx) direkt? –
Verwenden Sie OWIN-Pipeline mit Start? Möglicherweise müssen Sie 'TestServer' verwenden. https://blogs.msdn.microsoft.com/webdev/2013/11/26/unit-testing-owin-applications-using-testserver/ – Nkosi
Ich benutze nicht owin. – duyn9uyen