如何对会话值进行单元测试?

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)