2010-04-16 5 views
0

나는 다음과 같은 속성이 나는 다음과 같은 시험 방법으로 시험이 ActionFilterAttribute가 ViewModel로 데이터를 가져 오지 않는 이유는 무엇입니까?

public class ImportStatusAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var model = (IHasStatus)filterContext.Controller.ViewData.Model; 
     model.Status = (StatusMessageViewModel)filterContext.Controller.TempData["status"]; 
     filterContext.Controller.ViewData.Model = model; 
    } 
} 

(이 하나가 통과 할 때 나는 쓸 것이다 몇 가지의 첫 번째 ...)

[TestMethod] 
public void OnActionExecuted_ImportsStatusFromTempDataToModel() 
{ 
    // Arrange 
    Expect(new 
    { 
     Status = new StatusMessageViewModel() { Subject = "The test", Predicate = "has been tested" }, 
     Key = "status" 
    }); 

    var filterContext = new Mock<ActionExecutedContext>(); 
    var model = new Mock<IHasStatus>(); 
    var tempData = new TempDataDictionary(); 
    var viewData = new ViewDataDictionary(model.Object); 
    var controller = new FakeController() { ViewData = viewData, TempData = tempData }; 
    tempData.Add(expected.Key, expected.Status); 

    filterContext.Setup(c => c.Controller).Returns(controller); 
    var attribute = new ImportStatusAttribute(); 

    // Act 
    attribute.OnActionExecuted(filterContext.Object); 

    // Assert 
    Assert.IsNotNull(model.Object.Status, "The status was not exported"); 
    Assert.AreEqual(model.Object.Status.ToString(), ((StatusMessageViewModel)expected.Status).ToString(), "The status was not the expected"); 
} 

(Expect()는 것입니다있다 메서드를 사용하면 expected 개체의 일부 기대치를 절약 할 수 있습니다.)

은 첫 번째 어설 션에서 실패하고 머리를 얻을 수 없습니다. 이유는 무엇입니까? 디버깅을 통해 model이 올바르게 채워지고 (StatusMessageViewModel)filterContext.Controller.TempData["status"]에 올바른 데이터가 있음을 알 수 있습니다. 하지만 이후

model.Status = (StatusMessageViewModel) filterContext.Controller.TempData [ "status"];

model.Status은 여전히 ​​감시 윈도우에서 null입니다. 내가 왜 이럴 수 없어?

+0

모의 IHasStatus 객체를 사용하고있는 것으로 나타났습니다. 아마도 기본 동작이 무엇이든간에 .Object/.Status 속성을 일반 get/set 속성으로 처리하도록 조롱 프레임 워크에 신호를 보내야합니까? – Levi

+0

아마도 그랬을 것입니다. 대신이 인터페이스를 구현 한 가짜를 만들었을 때 예상대로 작동했습니다. –

+0

또한 'model.SetupProperty (c => c.Status)'를 호출하여 수정할 수 있습니다. –

답변

0

문제는 Moq이 Status 속성을 올바르게 처리하지 못한다는 것입니다.

model.SetupProperty(c => c.Status); 

으로 전화를 걸어보십시오.

관련 문제