2011-03-24 1 views
0

을 사용하여 정확한 결과를 반환 할 수UpdateModel 나는 두 시험 방법은 제어기에 호출이 모의 형태 컬렉션 값

[Test] 
    public void EditAction_Should_Redisplay_With_Errors_When_Update_Fails() 
    { 

     // Arrange 
     var controller = CreatePaperControllerAs("SomeUser"); 
     int id = 1; 

     FormCollection formValues = new FormCollection() { 
      { "IM_Paper.Year","xxx"} 
     }; 

     controller.ValueProvider = formValues.ToValueProvider(); 

     // Act 
     var result = controller.Edit(id, formValues) as ViewResult; 

     // Assert 
     Assert.IsNotNull(result, "Expected redisplay of view"); 
      Assert.IsTrue(result.ViewData.ModelState.IsValid, "Expected Errors"); 
    } 

컨트롤러의 작업 결과는

 [HttpPost, Authorize] 
    public ActionResult Edit(int id, FormCollection collection) 
    { 

     IM_Paper paper = _paperRepository.GetPaperById(id); 

     if (!paper.IsPostedByUser(User.Identity.Name)) 
      return View("InvalidOwner"); 
    try 
    { 
      UpdateModel(paper, "IM_Paper"); 

      _paperRepository.Save(); 

      return RedirectToAction("Details", new { id = paper.PaperId }); 
     } 
     catch 
     { 
      return View(paper); 
     } 
    } 
입니다.

그러나 try-catch 블록은 예외를 catch하지 않습니다 ("IM_Paper.Year"는 int 여야 함). 따라서 컨트롤러는 항상 Action 결과를 RedirectToAction으로 반환합니다. 첫 번째 경우에도 메모리 내 데이터는 변경되지 않았습니다.

이유가 궁금하십니까? "IM_Paper"클래스의 경우, POCO 생성기를 사용하고 엔티티 프레임 워크에서 생성했습니다. 클래스는 다음과 같습니다 :

public partial class IM_Paper 
{ 
    #region Primitive Properties 

    public virtual int PaperId 
    {get;set;} 

    public virtual string Author 
    {get;set;} 

    public virtual Nullable<int> Year 
    {get;set; 
    } ... 

답변

0

답을 찾았습니다. 속성을 IM_Paper 클래스로 한정하지 않았습니다.