【发布时间】:2010-04-16 15:59:20
【问题描述】:
我有以下属性
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 在我的监视窗口中仍然为空。为什么我不能这样做?
【问题讨论】:
-
我注意到您使用的是模拟 IHasStatus 对象。您是否可能需要向您的模拟框架发出信号,希望它将 .Object / .Status 属性视为正常的 get/set 属性,而不是默认行为?
-
可能就是这样 - 当我创建了一个假的来实现这个接口时,它按预期工作。
-
另外,它可以通过调用
model.SetupProperty(c => c.Status)来修复。
标签: c# asp.net-mvc-2 viewmodel action-filter