单元测试由于会话而失败

时间:2012-06-21 15:58:38

标签: asp.net-mvc-3 c#-4.0 asp.net-mvc-2 razor modelbinders

我为我的MVC3应用程序编写了Custom model binder。我决定使用Custom模型绑定器是因为我使用Sessions并且单元测试由于它们而失败。

现在我的问题是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);
}

2 个答案:

答案 0 :(得分:2)

Link可能会解决您的问题。您需要从上面的链接下载源代码和DLL,并且可以将值分配给测试中的Session。

[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"));
} 

答案 1 :(得分:0)

我建议使用Moq(或任何其他工具来模拟数据)并在控制器构造函数上传递值。 (不确定,但mabe使用依赖注入可以帮助解决这个问题,如果没有太多的过度工程)