自从我更新到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.List1..ctor(IEnumerable
1个集合) at 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.ControllerBase
1. TryUpdateModelAndTrackChanges [TModel](TModel模型,字符串前缀)在C:\ Users \ Adrian \ Documents \ Sites \ Zeiterfassung \ Zeiterfassung \ Controllers \ ControllerBase .cs:第164行 ......我自己的代码来自......
在Web服务器上运行时,相同的操作方法可以正常工作,因此我的猜测是单元测试中的依赖注入存在问题。
我需要为此设置一些东西吗?如果可能的话,我宁愿不回复之前的ASP.NET MVC版本。
答案 0 :(得分:2)
您需要模拟ControllerContext。我个人使用基于MvcContrib.TestHelper的Rhino 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>();
}