3

因爲我更新到ASP.NET MVC 3 Beta 1,所以無論何時在單元測試會話期間調用TryUpdateModel(),我都會得到一個NullReferenceExceptionASP.NET MVC 3測試版:TryUpdateModel在單元測試中拋出NullreferenceException

堆棧跟蹤看起來像這樣:

執行 System.NullReferenceException:未設置爲一個對象的實例對象引用。 at System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext) at System.Web.Mvc.ValueProviderFactoryCollection。 <> C_ DisplayClassc.b _7(ValueProviderFactory工廠) 在System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() 在System.Collections.Generic.List 1..ctor(IEnumerable 1個集合) 在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中:line 164 ...我自己的代碼從這裏開始...

相同的動作方法在Web服務器上運行時工作正常,所以我的猜測是t這在單元測試中是依賴注入的問題。

有什麼我需要設置此工作?如果可能的話,我寧願不恢復到之前的ASP.NET MVC版本。

回答

2

你需要模擬ControllerContext。我個人使用的是基於Rhino MocksMvcContrib.TestHelper來實現這一目標:

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

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

但任何嘲弄的框架可以做的工作。你只需要確保你的單元測試controller.ControllerContext不爲空。

0

如果單獨使用犀牛製品(不含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>(); 
} 
相關問題