2012-01-20 7 views
2
을 확인하지 않습니다

내 모델 클래스는 다음과 같다 :ModelState.IsValid 모델

public class PostInputViewModel 
    { 
     [Required] 
     [MinLength(1)] 
     [MaxLength(125)] 
     public string Title { get; set; } 

     [Required] 
     [AllowHtml] 
     [Display(Name="Content")] 
     public string Content { get; set; } 
    } 

및 컨트롤러은 다음과 같다 :

[HttpPost] 
     public ActionResult Write(PostInputViewModel input) 
     { 
      if (!ModelState.IsValid) 
       return View(input); 

      var post = new Post 
      { 
       Title = input.Title, 
       Content = input.Content, 
       DateCreated = DateTime.Now, 
       DateModified = DateTime.MaxValue, 
      }; 

      dbContext.Posts.Add(post); 
      dbContext.SaveChanges(); 

      return RedirectToAction("Index", "Home"); 
     } 

내가 F5를 눌러 웹 응용 프로그램을 실행, 그리고 돈 경우 입력 제목과 내용 값, ModelState.IsValid는 false입니다. 그러나 컨트롤러 테스트를 통해 컨트롤러 클래스를 테스트하면 ModelState.IsValid는 항상 true입니다. 테스트 케이스는 다음과 같습니다.

[TestMethod] 
     public void write_should_validate_model() 
     { 
      var input = new PostInputViewModel(); 
      input.Title = null; 
      input.Content = null; 
      var actionResult = controller.Write(input) as ViewResult; 

      Assert.IsFalse(actionResult.ViewData.ModelState.IsValid); 
     } 

누락 된 부분이 있습니까? 미리 감사드립니다.

+0

당신은 컨트롤러를 초기화 MVC 라이프 사이클을 실행하지 않았다. – SLaks

+0

정상적인 인스턴스처럼 컨트롤러 인스턴스를 만듭니다. 예를 들어 PostController controller = new PostController(); 컨트롤러가 MVC 라이프 사이클을 처리해야하는 경우, 테스트 케이스에서이를 수행하는 방법은 무엇입니까? – Ray

답변

9

, 당신은 당신의 어설 전에 TryValidateModel 메서드를 호출 할 수 있습니다. 그래도 괜찮을거야. 모델에 예상되는 특성이 적용되었는지 확인합니다.

+0

'TryValidateModel'은'protected internal'으로 표시되어 있습니다. 어떻게 사용합니까? –

+0

'TryValidateModel'은'Controller'의 멤버입니다. 컨트롤러는'Controller'를 상속 받아야하며 상속 된 클래스는 기본 클래스에있는 모든 protected 메소드를 호출 할 수 있습니다. – Jacob

+0

가 이해되었지만, 여기서는 테스트중인 컨트롤러의 인스턴스가 인스턴스화 된 테스트 메소드에서'TryValidateModel'을 호출 할 필요가 없습니까? –

4

컨트롤러에서 모델 유효성 검사가 수행되지 않습니다. 모델이 컨트롤러로 전달되기 전에 발생합니다.

컨트롤러 동작은 모델이 유효한지 '테스트'하는 것에주의하십시오. 테스트 케이스에서 모델의 유효성을 검사하는 사람은 누구입니까? 아무것도!

Validator .NET 클래스를 사용하여 유효성 검사를 수행 할 수 있지만이 경우 .NET 유효성 검사를 테스트 할 수 있습니다. 이것은 단위 테스트를 작성하는 동안 사람들이 자주 범하는 실수 중 하나입니다. 그들은 자신의 코드 대신 제 3 자 코드를 테스트합니다.

올바른 유효성 검사 속성을 클래스에 적용했는지 실제로 테스트하려면 클래스를 반영하고 속성의 특성을 확인할 수 있습니다. 이렇게하면 .NET 유효성 검사 레이어를 건너 뛰고 속성을 놓친 경우에만 테스트가 실패합니다.

controller.TryValidateModel(input); 

을하지만 난 당신이 정말로 유일한 검증 특성을 테스트 할 것 동의합니다 : 당신이 모델을 검증하기 위해 컨트롤러의 시도를 원한다면

+0

그는 .Net 코드를 테스트하지 않습니다. 그는 자신의 속성을 테스트하고 있습니다. 시험의 타당성은 여전히 ​​논쟁의 여지가 있습니다. – SLaks

4

실제로 컨트롤러의 Write 메서드가 호출되기 전에 유효성 검사가 발생합니다.이 메서드는 ModelState 속성을 채 웁니다.

귀하의 단위 테스트는 실제로 내 의견으로는 컨트롤러를 테스트하지 않습니다 (실제로 이것이 무엇을하려는 것인지).

진정한 컨트롤러 테스트는 다음과 같이 보일 것입니다 :

 [TestMethod] 
     public void write_should_validate_model() 
     { 
      controller.ModelState.AddModelError("Title", "Empty"); //These values don't really matter 

      var actionResult = controller.Write(new PostInputViewModel()) as ViewResult; 

      //Assert that the correct view was returned i.e. Not Home/Index 
      //Assert that a new post has not been added to your Mock Repository     
     } 
관련 문제