【问题标题】:Why does this ActionFilterAttribute not import data to the ViewModel?为什么这个 ActionFilterAttribute 不向 ViewModel 导入数据?
【发布时间】: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 =&gt; c.Status)来修复。

标签: c# asp.net-mvc-2 viewmodel action-filter


【解决方案1】:

问题在于 Moq 没有正确处理 Status 属性。来电

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

解决了问题。

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多