18

내가 이런 컨트롤러에 대한 단위 테스트를 작성하고 테스트모델 상태 유효성 검사

[TestMethod] 
public void TestLogin_InvalidModel() 
{ 
    AccountController controller = CreateAccountController(); 

    ... 
    var response = controller.PostLogin(new LoginModel() { }); 

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

} 

실제로 ModelState의 유효성이 확인되었습니다. 두 필드가 모두 필요하므로 실제로 이상합니다. 누구 조언?

답변

23

모델 상태가 유효한 이유는 컨트롤러를 새로 시작할 때 새로운 모델 상태가 만들어지기 때문입니다. 웹 API는 여기서 매개 변수 바인딩을 수행하지 않으므로 모델 상태 오류를 추가 할 기회조차 없습니다.

단위 테스트로 유지하려는 경우 모델 상태 오류를 직접 추가하고 어떤 일이 발생하는지 테스트해야합니다.

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

및 인 메모리 서버에 대해 테스트를 시도 : 당신이 모델 상태가 실제 요청에 유효하지 않을 것이라는 점을 테스트하려면

, 난 당신이 블로그 게시물을 읽을 것을 권장합니다. 한 가지 사소한 점은 요청시 ObjectContent 대신 StringContent를 사용하여 웹 API가 본문을 제대로 역 직렬화 및 바인딩하려고하는지 확인하는 것입니다.

+2

+1 유세프. 또한 요청 파이프 라인에 대한 다음 웹 API 포스터를 살펴볼 수도 있습니다. http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster-grayscale.pdf –

16

TL : DR Youssef에서 제공하는 전체 기사를 읽지 않고 ModelState.IsValid를 만드는 방법에 대한 빠른 해결책을 원한다면 false를 반환하십시오. 이 작업을 수행. 이제

[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); 

} 

나는 CreateAccountController()를 상상할 수는 최소 다음과 같이 보입니다 - 앞서 언급했듯이>

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

희망이 있습니다 :)

+0

예를 들어 주셔서 감사합니다. 내가 만든 유일한 차이점은 assert 유형입니다. Assert.IsInstanceOfType (actResult, typeof (InvalidModelStateResult))); –

1

인터넷 검색 사람들을위한 신속한 답변을 제공합니다, 당신을 ModelState의 유효성을 검사하기 위해 통합 테스트가 필요합니다. 그래서, Asp.Net 코어로, 나는이 질문을 파고 있어요 패키지 Microsoft.AspNetCore.TestHost 추가

ModelState

의 Asp.Net 코어와 테스트 및 검증을 통합하기위한 간단한 솔루션을 추가하고 요청이 단순한를 제출할 수 있습니다

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); 

당신은 여기에 대한 자세한 내용을 확인할 수 있습니다 http://asp.net-hacker.rocks/2017/09/27/testing-aspnetcore.html

그것이 도움이되기를 바랍니다.

+0

.net 핵심 답변을 찾고 있다면 올바른 답변입니다. – THBBFT