2

我已经为我的 MVC3 应用程序编写了自定义模型绑定器。我决定使用自定义模型绑定器是因为我正在使用会话并且单元测试因此而失败。

现在我的问题是该About操作不接受任何参数,但它需要将存储在购物车中的值传递给查看而不使用会话。因为使用会话它将无法通过单元测试。只有当我将购物车作为参数传递给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(或任何其他模拟数据的工具)并在控制器构造函数上传递值。(不确定,但如果不是过度工程化,mabe use Dependency Injection 会对此有所帮助)

于 2012-06-21T16:04:55.297 回答