Paw*_*wan 7 c# asp.net-mvc unit-testing moq
下面是控制器方法代码(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………
}
Run Code Online (Sandbox Code Playgroud)
以下是单元测试方法: -
[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);
}
Run Code Online (Sandbox Code Playgroud)
我想问一下如何在我的动作方法上测试或模拟会话值(在if条件下)?
我在第1部分和第2部分(上面的单元测试方法中的评论部分)中尝试过某些事情.但是没有任何工作可做.
所以任何人都可以让我知道如何进行会话单元测试?
编辑:
上面的东西没有工作而不是下面的东西: -
System.Web.HttpContext.Current.Session["ReturnProductAddressID"] = "12";
Run Code Online (Sandbox Code Playgroud)
意味着我是否直接在单元测试方法中设置会话值.但我想知道这是正确的方法吗?
Ash*_*rma 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);
Run Code Online (Sandbox Code Playgroud)
为控制器注册mockControllerContext
var controller = new YourController();
controller.ControllerContext = mockControllerContext.Object;
Run Code Online (Sandbox Code Playgroud)
最后行动
var actual = controller.SelectProduct(YourModel);
Run Code Online (Sandbox Code Playgroud)
所以,你的代码就是这样的.
[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);
}
Run Code Online (Sandbox Code Playgroud)