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.WhereSelectEnumerableIterator2.MoveNext() 在 System. Collections.Generic.List 1..ctor(IEnumerable1 collection) 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.ControllerBase1.TryUpdateModelAndTrackChanges[TModel](TModel model, String prefix) in C:\Users\Adrian\Documents\Sites\Zeiterfassung\Zeiterfassung\ Controllers\ControllerBase.cs:line 164 ...我自己的代码从这里开始...

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

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

4

2 回答 2

2

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

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

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

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

于 2010-10-27T16:16:35.527 回答
0

如果单独使用 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>();
}
于 2010-12-02T08:19:56.273 回答