【问题标题】:MVC4 - TryValidateModel breaks unit testsMVC4 - TryValidateModel 打破单元测试
【发布时间】:2013-10-14 16:03:34
【问题描述】:

我有以下控制器方法

    public ActionResult Create(Category category)
    {
        //default values
        if (string.IsNullOrEmpty(category.GeoAreaLevelIdentifier))
        {
            category.GeoAreaLevelIdentifier = "OutputArea";
        }                
        category.CreatorIdentifier = EsdContext.User.UniqueIdentifier.ToString();            
        category.Created = DateTime.Now;

        //validation
        RevalidateModel(category);

        new CategoryBroker().Create(category);
        return JsonNow(category);
    }

将一些默认值填充到模型中,然后对其进行验证。这是因为允许客户端代码在没有某些必填字段的情况下提交模型。缺失的字段由控制器填充(见上文)。

RevalidateModel 方法调用 TryValidateModel:

    protected void RevalidateModel(object model)
    {
        ModelState.Clear();
        TryValidateModel(model); //called explicitly since model has been updated
        if (!ModelState.IsValid)
        {
            //error message
        }
    }

但是当我从单元测试中调用 Create 方法时,它会失败,因为 TryValidateModel 需要 controllerContext:

     Value cannot be null.Parameter name: controllerContext

解决此问题的最佳方法是什么? 我应该通过 MvcContrib TestHelper 创建 controllerContext 吗?

【问题讨论】:

  • 是的,您需要模拟控制器上下文才能从单元测试中调用此方法。
  • @mayabelle "你需要模拟控制器上下文" - 你知道最好的方法吗?你试过 MvcContrib.TestHelper 吗?

标签: unit-testing validation asp.net-mvc-4 mvccontrib


【解决方案1】:

在这种情况下

using Moq;
.........
        readonly MockRepository _mockRepository = new MockRepository(MockBehavior.Default);
.........
        controller.ControllerContext = _mockRepository.Create<ControllerContext>().Object;

效果很好。

最好的。

【讨论】:

  • 模拟 ControllerContext 完全没问题 - 所以问题中的测试将毫无例外地工作。我也经常使用它,想知道为什么这个答案被否决...
猜你喜欢
  • 2017-06-24
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多