ASP.NET MVC 3 beta:TryUpdateModel在单元测试中抛出NullreferenceException

时间:2010-10-27 15:44:13

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

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

堆栈跟踪如下所示:

  

执行   System.NullReferenceException:未将对象引用设置为对象的实例。      在System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext)      在System.Web.Mvc.ValueProviderFactoryCollection。<> c_ DisplayClassc.b _7(ValueProviderFactory factory)      在System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext()      在System.Collections.Generic.List 1..ctor(IEnumerable 1个集合)      at System.Linq.Enumerable.ToList [TSource](IEnumerable 1 source) at System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext) at System.Web.Mvc.ControllerBase.get_ValueProvider() at Zeiterfassung.Controllers.ControllerBase 1. TryUpdateModelAndTrackChanges [TModel](TModel模型,字符串前缀)在C:\ Users \ Adrian \ Documents \ Sites \ Zeiterfassung \ Zeiterfassung \ Controllers \ ControllerBase .cs:第164行   ......我自己的代码来自......

在Web服务器上运行时,相同的操作方法可以正常工作,因此我的猜测是单元测试中的依赖注入存在问题。

我需要为此设置一些东西吗?如果可能的话,我宁愿不回复之前的ASP.NET MVC版本。

2 个答案:

答案 0 :(得分:2)

您需要模拟ControllerContext。我个人使用基于MvcContrib.TestHelperRhino Mocks来实现这一目标:

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

// act
var actual = controller.Index();

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

答案 1 :(得分:0)

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

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

就个人而言,我实际创建了一个Test Class级变量:

private HomeController controller;

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

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