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 コレクション) 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 モデル、文字列プレフィックス) の C:\Users\Adrian\Documents\Sites\Zeiterfassung\Zeiterfassung\ Controllers\ControllerBase.cs:164行目…ここから自分のコード…

同じアクション メソッドは、Web サーバー上で実行すると問題なく動作するため、ユニット テストでの Dependency Injection に問題があると推測されます。

これが機能するためにセットアップする必要があるものはありますか? 可能であれば、以前の 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.ControllerContextnullでないことを確認するだけです。

于 2010-10-27T16:16:35.527 に答える
0

Rhino モックを単独で (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>();
}
于 2010-12-02T08:19:56.273 に答える