18

ich einen Komponententest, wie dies für einen Controller schreibe:Modell Statusüberprüfung in Einheit testet

public HttpResponseMessage PostLogin(LoginModel model) 
{ 
    if (!ModelState.IsValid) 
     return new HttpResponseMessage(HttpStatusCode.BadRequest); 
} 

das Modell wie folgt aussieht:

public class LoginModel 
{ 
    [Required] 
    public string Username { set; get; } 
    [Required] 
    public string Password { set; get; } 
} 

Dann Unit-Test, wie ich diese haben:

Eigentlich ist der ModelState validiert ... was für mich seltsam ist, da beide Felder benötigt werden ... Konnte jemand beraten?

Antwort

23

Der Grund für die Gültigkeit des Modellzustands ist, dass ein neuer Modellstatus erstellt wird, wenn Sie einen Controller neu starten. Die Web-API führt hier keine Parameterbindung durch, sodass sie nicht einmal Modellstatusfehler hinzufügen kann.

Wenn Sie dies als Komponententest beibehalten möchten, sollten Sie die Modellstatusfehler selbst hinzufügen und testen, was passiert.

Wenn Sie testen möchten, dass die Modellzustand auf einem realen Anforderung ungültig sein würde, empfehle ich Ihnen lesen dieses Blog-Post:

http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx

und versuchen Tests gegen einen In-Memory-Server. Ein kleiner Hinweis für Ihren Fall wäre, dass Sie möglicherweise einen StringContent anstelle eines ObjectContent für die Anforderung verwenden möchten, um sicherzustellen, dass die Web-API versucht, den Body korrekt zu deserialisieren und zu binden.

+2

+1 mit Youssef. Außerdem können Sie sich das folgende Web-API-Poster für die Anforderungspipeline ansehen. http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster-grayscale.pdf –

16

TL; DR Wenn Sie nicht den gesamten Artikel von Youssef lesen möchten und eine schnelle Lösung für die Rückgabe von ModelState.IsValid false möchten. Mach das.

[TestMethod] 
public void TestLogin_InvalidModel() 
{ 
    AccountController controller = CreateAccountController(); 
    // new code added --> 
    controller.ModelState.AddModelError("fakeError", "fakeError"); 
    // end of new code 
    ... 
    var response = controller.PostLogin(new LoginModel() { }); 

    Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); 

} 

Jetzt kann ich die CreateAccountController vorstellen() sieht wie folgt aus etwas für Mindest ->

return new AccountApiController() 
{ 
    Request = new HttpRequestMessage(), 
    Configuration = new HttpConfiguration() 
}; 

Hope this für diejenigen, die eine schnelle Antwort gibt :) googeln

+0

Danke für das Beispiel. Der einzige Unterschied, den ich gemacht habe, war der Typ der Assert: Assert.IsInstanceOfType (actResult, typeof (InvalidModelStateResult)); –

1

Wie bereits erwähnt, Sie benötigen Integrationstests, um den ModelState zu validieren. Also, mit Asp.Net Core ich diese Frage bin zu graben, eine einfache Lösung geben für Tests mit Asp.Net Kern und Validierung von Model Integration

Fügen Sie das Paket Microsoft.AspNetCore.TestHost und Sie können diese einfach einreichen Anfragen:

var server = new TestServer(new WebHostBuilder().UseStartup<Startup>()); 
var client = server.CreateClient(); 
var model = new { Name = String.Empty }; 
var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json"); 
var result = await client.PostAsync("/api/yourApiEndpoint", content); 
result.StatusCode.Should().Be(HttpStatusCode.BadRequest); 

Sie können weitere Informationen finden Sie hier: http://asp.net-hacker.rocks/2017/09/27/testing-aspnetcore.html

Hoffe, es hilft.

+0

Die richtige Antwort, wenn Sie nach einer .net Kernantwort suchen. – THBBFT

Verwandte Themen