【问题标题】:ASP.NET MVC 3 beta: TryUpdateModel throws NullreferenceException in unit testASP.NET MVC 3 beta:TryUpdateModel 在单元测试中抛出 NullreferenceException
【发布时间】:2010-10-27 15:44:13
【问题描述】:

自从我更新到 ASP.NET MVC 3 Beta 1 后,每当我在单元测试会话期间调用 TryUpdateModel() 时都会收到 NullReferenceException

堆栈跟踪如下所示:

执行 System.NullReferenceException:对象引用未设置为对象的实例。 在 System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext) 在 System.Web.Mvc.ValueProviderFactoryCollection.c_DisplayClassc.b_7(ValueProviderFactory 工厂) 在 System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() 在 System.Collections.Generic.List1..ctor(IEnumerable1 集合) 在 System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext) at System.Web.Mvc.ControllerBase.get_ValueProvider() at Zeiterfassung.Controllers.ControllerBase1.TryUpdateModelAndTrackChanges[TModel](TModel 模型,字符串前缀) 在 C:\Users\Adrian\Documents\Sites\Zeiterfassung\Zeiterfassung\Controllers\ControllerBase.cs :第 164 行 ...我自己的代码从这里开始...

同样的action方法在web服务器上运行时效果很好,所以我猜测是单元测试中依赖注入的问题。

我需要进行一些设置才能使其正常工作吗?如果可能,我宁愿不恢复到以前的 ASP.NET MVC 版本。

【问题讨论】:

    标签: asp.net-mvc unit-testing dependency-injection asp.net-mvc-3


    【解决方案1】:

    您需要模拟 ControllerContext。我个人使用基于Rhino MocksMvcContrib.TestHelper 来实现这一点:

    // arrange
    var controller = new HomeController();
    new TestControllerBuilder().InitializeController(controller);
    
    // act
    var actual = controller.Index();
    

    但任何模拟框架都可以完成这项工作。您只需要确保在您的单元测试中controller.ControllerContext 不为空。

    【讨论】:

      【解决方案2】:

      如果单独使用 Rhino Mocks(不使用 MvcContrib.TestHelper),请尝试以下操作:

      controller = new HomeController(repository);
      controller.ControllerContext = MockRepository.GenerateStub<ControllerContext>();
      

      就个人而言,我实际上创建了一个测试类级别变量:

      private HomeController controller;
      

      然后对于每个测试我重新初始化这个变量:

      [TestInitialize()]
      public void MyTestInitialize()
      {
          controller = new HomeController();
          controller.ControllerContext = MockRepository.GenerateStub<ControllerContext>();
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多