я следующий атрибутПочему этот 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 в моем окне часов. Почему я не могу это сделать?
Я заметил, что вы используете макет объекта IHasStatus. Возможно, вам приходится сигнализировать своей издевательской структуре, что вы хотите, чтобы она обрабатывала свойства .Object/.Status как обычные свойства get/set, а не все, что может быть по умолчанию? – Levi
Возможно, это было - когда я создал фальшивку, которая реализовала этот интерфейс, она работала так, как ожидалось. –
Кроме того, его можно было бы зафиксировать вызовом 'model.SetupProperty (c => c.Status)'. –