Asp.net mvc ASP.NET MVC 3 beta:TryUpdateModel在单元测试中引发NullreferenceException

Asp.net mvc ASP.NET MVC 3 beta:TryUpdateModel在单元测试中引发NullreferenceException,asp.net-mvc,unit-testing,dependency-injection,asp.net-mvc-3,Asp.net Mvc,Unit Testing,Dependency Injection,Asp.net Mvc 3,自从我更新到ASP.NET MVC 3 Beta 1以来,每当我在单元测试会话期间调用TryUpdateModel()时,我都会得到一个NullReferenceException 堆栈跟踪如下所示: 执行 System.NullReferenceException:对象引用未设置为对象的实例。 位于System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext ControllerContext) 在Syst

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

堆栈跟踪如下所示:

执行 System.NullReferenceException:对象引用未设置为对象的实例。 位于System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext ControllerContext) 在System.Web.Mvc.ValueProviderFactoryCollection.c_中显示ClassC.b_7(ValueProviderFactory工厂) 在System.Linq.Enumerable.whereSelectEnumerableInterator
2.MoveNext()中
在System.Linq.Enumerable.Where中选择EnumerableInterator
2.MoveNext() 位于System.Collections.Generic.List
1..ctor(IEnumerable
1集合) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1源)
位于System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext ControllerContext)
在System.Web.Mvc.ControllerBase.get_ValueProvider()上
在Zeiterfassung.Controllers.ControllerBase
1.TryUpdateModelAndTrackChanges[TModel](TModel,字符串前缀)中的C:\Users\Adrian\Documents\Sites\Zeiterfassung\Zeiterfassung\Controllers\ControllerBase.cs:第164行 ... 从现在开始我自己的代码

在web服务器上运行时,同样的操作方法也可以很好地工作,因此我猜想这是单元测试中依赖项注入的问题


有什么我需要设置的工作吗?如果可能的话,我不想回到以前的ASP.NET MVC版本

您需要模拟ControllerContext。就我个人而言,我使用基于的方法来实现这一点:

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

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

但任何嘲弄框架都可以做到这一点。您只需确保单元测试中的controller.ControllerContext不为null。

如果单独使用Rhino Mock(不带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>();
}
[TestInitialize()]
公共无效MyTestInitialize()
{
控制器=新的HomeController();
controller.ControllerContext=MockRepository.generateSub();
}