C# 如何对会话值进行单元测试?
下面是控制器方法(c#)的一段代码:- 以下是单元测试方法:-C# 如何对会话值进行单元测试?,c#,asp.net-mvc,unit-testing,moq,C#,Asp.net Mvc,Unit Testing,Moq,下面是控制器方法(c#)的一段代码:- 以下是单元测试方法:- [TestMethod] public void SelectProduct_Condition1_Test() { //Arrange var controller = new ProductController(); var prodName = string.Empty; var block = 1; var productAddress
[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);
}
意味着如果我直接在单元测试方法中设置会话值。但我想知道这是正确的方法吗?您可以使用Mock。这是我以前的做法 下载最新MoQ 控制器的主运行中心会话
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 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);
}
[TestMethod]
公共无效选择产品\u条件1\u测试()
{
var prodName=string.Empty;
var块=1;
var productAddressId=0;
var mockControllerContext=new Mock();
var mockSession=new Mock();
mockSession.SetupGet(s=>s[“ReturnProductAddressID”])。返回(“123”);//somevalue
mockControllerContext.Setup(p=>p.HttpContext.Session).Returns(mockSession.Object);
var controller=new ProductController();
controller.ControllerContext=mockControllerContext.Object;
//表演
var actual=控制器。选择产品(prodName、块、productAddressId);
}
您必须使用模拟。为了快速参考,我尝试过这个,但是当我调试控制器中的代码时,它显示了会话null。你注册了ControllerContext对象吗?这应该行得通。var controller=newyourcontroller();controller.ControllerContext=mockControllerContext.Object;,是的,我做了。请检查以下:-var controller=new ProductController();var mockControllerContext=new Mock();var mockSession=new Mock();SetupGet(s=>s[“ReturnProductAddressID]”)。返回(“4”)//somevalue mockControllerContext.Setup(p=>p.HttpContext.Session).Returns(mockSession.Object);controller.ControllerContext=mockControllerContext.Object;我更新了我的答案,你能试试那个测试方法吗?我再次尝试了你的代码,但在if条件下会话仍然是空的(在action方法中)。
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);
}