我为我的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);
}
答案 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使用依赖注入可以帮助解决这个问题,如果没有太多的过度工程)