2010-04-16 48 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對象的一些期望方法...)

當我運行測試,它失敗的第一個斷言,我不能醃肉讓我的頭nd爲什麼。調試,我可以看到model正確填充,並且(StatusMessageViewModel)filterContext.Controller.TempData["status"]具有正確的數據。但在

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

model.Status在我的觀察窗口中仍然爲空。爲什麼我不能這樣做?

+0

我注意到你正在使用一個模擬IHasStatus對象。你是否可能不得不向你的模擬框架發出信號,表示你希望它將.Object/.Status屬性作爲普通的get/set屬性而不是默認行爲可能是什麼? – Levi 2010-04-16 16:53:19

+0

這可能是它 - 當我創建了一個實現此接口的虛假代碼時,它按預期工作。 – 2010-04-16 17:52:01

+0

另外,它可以通過調用'model.SetupProperty(c => c.Status)'來修復。 – 2010-04-16 17:55:32

回答

0

問題是Moq沒有正確處理Status屬性。致電

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

修復了這個問題。