Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对会话值进行单元测试?_C#_Asp.net Mvc_Unit Testing_Moq - Fatal编程技术网

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

下面是控制器方法(c#)的一段代码:-

以下是单元测试方法:-

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