2

MVC3アプリケーション用のカスタムモデルバインダーを作成しました。カスタムモデルバインダーを使用することにしたのは、セッションを使用していて、それらが原因で単体テストが失敗するためです。

私の問題は、Aboutアクションがパラメータを受け入れないことですが、Sessionを使用せずに表示するには、カートに保存されている値を渡す必要があります。セッションを使用すると、単体テストに失敗するためです。モデルバインダーは、カートをパラメーターとしてに渡した場合にのみ機能しますAbout

何かアイデアがあれば教えてください。

どうもありがとう

モデルバインダー

public class CartModelBinder : IModelBinder
{
    private const string CartSessionKey = "Cart";

    public object BindModel(ControllerContext controllerContext, ModelBindingContext modelBindingContext)
    {
        Cart cart = null;

        if(IsCartExistInSession(controllerContext))
        {
            cart = GetCartFromSession(controllerContext); 
        }
        else
        {
            cart = new Cart();
            AddCartToSession(controllerContext, cart);
        }
        return cart;
    }

    private static Cart GetCartFromSession(ControllerContext controllerContext)
    {
        return controllerContext.HttpContext.Session[CartSessionKey] as Cart;
    }

    private static void AddCartToSession(ControllerContext controllerContext, Cart cart)
    {
        controllerContext.HttpContext.Session[CartSessionKey] = cart;
    }

    private static bool IsCartExistInSession(ControllerContext controllerContext)
    {
        return controllerContext.HttpContext.Session[CartSessionKey] != null;
    }       
}

コントローラ

[HttpPost]
public ActionResult AddToCartfromAbout(Cart cart, int productId = 2)
{
    var product = _productRepository.Products.First(p => p.ProductId == productId);
    cart.AddItem(product, 1);
    return View("About");
}

public ActionResult About()
{ 
    // Need something here to get the value of cart 
    return View(cart);
}
4

2 に答える 2

2

このリンクはあなたの問題を解決するかもしれません。上記のリンクからソースとDLLをダウンロードする必要があり、それらをテストのセッションに値を割り当てることができます。

[Test]
public void AddSessionStarShouldSaveFormToSession()
{
    // Arrange
    TestControllerBuilder builder = new TestControllerBuilder();
    StarsController controller = new StarsController();
    builder.InitializeController(controller);
    controller.HttpContext.Session["NewStarName"] = "alpha c";

    // Act
    RedirectResult result = controller.Index() as RedirectResult;

    // Assert
    Assert.IsTrue(result.Url.Equals("Index"));
} 
于 2012-06-22T08:16:10.707 に答える
0

Moq(またはデータをモックするための他のツール)を使用して、コントローラーコンストラクターに値を渡すことをお勧めします。(確かではありませんが、あまり過剰に設計されていない場合は、依存性注入を使用するとこれに役立ちます)

于 2012-06-21T16:04:55.297 に答える