Adam FreemanとStephen Sanderson(Apress)のプロASP.Net MVC3フレームワークを使って作業しています。第8章の終わり近くで、ショッピングカートアプリケーションと単体テストを作成しました。私はこの時点で問題はありませんでしたが、単体テストは理解できない理由で失敗しています。本の正誤表にはこの問題についての言及はない。MVC3 ViewResult.ViewDataエラー: 'オブジェクトインスタンス上でメソッドを見つけることができません'
私はWindows 7 64-bit、.Net 4、VS 2010 Ultimateを使用しています。
ShippingDetailsクラス(配送先住所など)のインスタンスとCartクラスのインスタンス(注文されたアイテム)は、ViewResultを返すCartControllerの「Checkout」アクションに渡されます。 ModelStateが有効な場合、処理は完了し、カートはクリアされ、ビュー(「完了」)が返されます。 ModelStateが有効でない場合、View(shippingDetails)が返されます(shippingDetailsは渡されたパラメータです)。
空のカートをチェックアウトすることができないようにするために単体テストを作成しました。 cartControllerがインスタンス化され、カートとShippingDetailsの新しいインスタンスを渡してCheckoutアクションが呼び出され、カート内のアイテムの数が0になります。
コントローラのCheckoutアクション(ユニットテストデバッグモード) result.ViewDataが後続のコード( "result"は返されたViewResult)にカーソルを置くことができ、 "result.ViewDataは 'System.ArgumentException'型の例外を送出しました。情報を展開すると、私は "ベース"と "メッセージ"、 "オブジェクトインスタンスでメソッドを見つけることができません"を参照してください。失敗した単体テストの詳細は次のようになります。テストメソッドSportsStore.UnitTests.CartTests.Cannot_Checkout_Empty_Cart例外がスローされました:System.EntryPointNotFoundException:エントリポイントが見つかりませんでした。ここで
CartController "チェックアウト" アクションさ:
[HttpPost]
public ViewResult Checkout(Cart cart, ShippingDetails shippingDetails)
{
if (cart.Lines.Count() == 0) {
ModelState.AddModelError("Cart", "Sorry, your cart is empty!");
}
if (ModelState.IsValid) {
orderProcessor.ProcessOrder(cart, shippingDetails);
cart.Clear();
return View("Completed");
} else {
return View(shippingDetails);
}
}
ここでは、ユニットテストです:
[TestMethod]
public void Cannot_Checkout_Empty_Cart()
{
// Arrange
Mock<IOrderProcessor> mock = new Mock<IOrderProcessor>();
Cart cart = new Cart();
ShippingDetails shippingDetails = new ShippingDetails();
CartController target = new CartController(null, mock.Object);
// Act
ViewResult result = target.Checkout(cart, shippingDetails);
// Assert - check that the order hasn't been passed on to the processor
mock.Verify(m => m.ProcessOrder(It.IsAny<Cart>(), It.IsAny<ShippingDetails>()),
Times.Never());
// Assert - check that the method is returning the default view
Assert.AreEqual("", result.ViewName);
// Assert - check that we are passing an invalid model to the view
Assert.AreEqual(false, result.ViewData.ModelState.IsValid);
}
あなたの助けが理解されます。これは以前はASP.Net MVCフォーラムに掲載されていましたが、何の反応もありませんでした。
その作業がうまくあなたを持っていますこの問題を解決するために私はまったく同じ問題を抱えています。 – Paleta