下面是控制器方法(c#)的代码片段: -
public ActionResult SelectProduct(string ProdName, int Block, int ProductAddressId = 0)
{
if (ProductAddressId == 0 && Block == 1 && System.Web.HttpContext.Current.Session["ReturnProductAddressID"] != null)
{
ProductAddressId = (int)System.Web.HttpContext.Current.Session["ReturnProductAddressID"];
}
//other stuffs………
}
以下是单元测试方法: -
[TestMethod]
public void SelectProduct_Condition1_Test()
{
//Arrange
var controller = new ProductController();
var prodName = string.Empty;
var block = 1;
var productAddressId = 0;
//section 1
/*var mockControllerContext = new Mock<ControllerContext>();
var mockSession = new Mock<HttpSessionStateBase>();
mockSession.SetupGet(s => s["ReturnProductAddressID"]).Returns("1");
mockControllerContext.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);*/
//section 2
/*int sessionValue = 1;
var mockControllerContext = new Mock<ControllerContext>();
var mockSession = new Mock<HttpSessionStateBase>();
mockSession.SetupSet(s => s["ReturnProductAddressID"] = It.IsAny<int>()).Callback((string name, object val) => sessionValue = (int)val);
mockSession.SetupGet(s => s["ReturnProductAddressID"]).Returns(() => sessionValue);
mockControllerContext.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);*/
//Act
var actual = controller.SelectProduct(prodName,block,productAddressId);
}
我想问一下如何在我的动作方法上测试或模拟会话值(在if条件下)?
我已尝试过第1部分和第2部分中的某些内容(上面单元测试方法中的注释部分)。但没有任何方法可以解决这个问题。
所以有人可以让我知道如何为会话进行单元测试吗?
修改
上述任何内容都不起作用,而不是下面的内容: -
System.Web.HttpContext.Current.Session["ReturnProductAddressID"] = "12";
表示我是否直接在单元测试方法中设置会话值。但我想知道这是正确的方法吗?
答案 0 :(得分:12)
你可以使用Mock。以下是我以前做过的事情。
下载更新的MoQ https://www.nuget.org/packages/moq
控制器的Moc会话
var mockControllerContext = new Mock<ControllerContext>();
var mockSession = new Mock<HttpSessionStateBase>();
mockSession.SetupGet(s => s["ReturnProductAddressID"]).Returns("123"); //somevalue
mockControllerContext.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);
为控制器注册mockControllerContext
var controller = new YourController();
controller.ControllerContext = mockControllerContext.Object;
最后行动
var actual = controller.SelectProduct(YourModel);
所以,你的代码就是这样的。
[TestMethod]
public void SelectProduct_Condition1_Test()
{
var prodName = string.Empty;
var block = 1;
var productAddressId = 0;
var mockControllerContext = new Mock<ControllerContext>();
var mockSession = new Mock<HttpSessionStateBase>();
mockSession.SetupGet(s => s["ReturnProductAddressID"]).Returns("123"); //somevalue
mockControllerContext.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);
var controller = new ProductController();
controller.ControllerContext = mockControllerContext.Object;
//Act
var actual = controller.SelectProduct(prodName, block, productAddressId);
}