2010-04-16 1 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 объекта ...)

Когда я запускаю тест, он терпит неудачу на первом утверждении, и я не могу получить мою голову Arou и почему. Отладка, я вижу, что 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 правильно. A -

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

исправлена ​​ошибка.