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

时间:2014-04-08 13:02:34

标签: 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………    
}

以下是单元测试方法: -

   [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";

表示我是否直接在单元测试方法中设置会话值。但我想知道这是正确的方法吗?

1 个答案:

答案 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);
    }