How to Mock Session variables in ASP.net core unit testing project?
1) I have created a mock object of a session.
Mock mockHttpContext = new Mock(); Mock mockHttpContext = new Mock();Mock mockSession = new Mock().As();
2) Setup GetString() MEthod
mockSession.Setup(s => s.GetString("ModuleId")).Returns("1");
3) created controllerContext and assigned mockhttpContext object
controller.ControllerContext.HttpContext = mockHttpContext.Object;
4) Trying to read from a controller.
HttpContext.Session.GetString("ModuleId")
Whereas I get a null value of "ModuleId". Please help me to mock session GetString() method
Example:
//Arrange
//Note: Mock session
Mock<HttpContext> mockHttpContext = new Mock<HttpContext>();
Mock<ITestSession> mockSession = new Mock<ISession>().As<ITestSession>();
//Cast list to IEnumerable
IEnumerable<string> sessionKeys = new string[] { };
//Convert to list.
List<string> listSessionKeys = sessionKeys.ToList();
listSessionKeys.Add("ModuleId");
sessionKeys = listSessionKeys;
mockSession.Setup(s => s.Keys).Returns(sessionKeys);
mockSession.Setup(s => s.Id).Returns("89eca97a-872a-4ba2-06fe-ba715c3f32be");
mockSession.Setup(s => s.IsAvailable).Returns(true);
mockHttpContext.Setup(s => s.Session).Returns(mockSession.Object);
mockSession.Setup(s => s.GetString("ModuleId")).Returns("1");
//Mock TempData
var tempDataMock = new Mock<ITempDataDictionary>();
//tempDataMock.Setup(s => s.Peek("ModuleId")).Returns("1");
//Mock service
Mock<ITempServices> mockITempServices= new Mock<ITempServices>();
mockITempServices.Setup(m => m.PostWebApiData(url)).Returns(Task.FromResult(response));
//Mock Management class method
Mock<ITestManagement> mockITestManagement = new Mock<ITestManagement>();
mockITestManagement .Setup(s => s.SetFollowUnfollow(url)).Returns(Task.FromResult(response));
//Call Controller method
TestController controller = new TestController (mockITestManagement .Object, appSettings);
controller.ControllerContext.HttpContext = mockHttpContext.Object;
controller.TempData = tempDataMock.Object;
//Act
string response = await controller.Follow("true");
// Assert
Assert.NotNull(response);
Assert.IsType<string>(response);
At first i created implementation of ISession:
Secondly implemented it during controller definition:
I just ran into this problem recently and the only way out of it is to mock the function that the GetString method wraps, which is TryGetValue.
So you don't need to mock the call to the GetString method, you just mock what method that calls behind the scenes.
I used Pankaj Dhote's class for a mock ISession. I have to change one method from this:
to the code below. Otherwise the reference to sessionStorage[key].ToString() returns the name of the type rather than the value in the dictionary.
Solution given by Pankaj Dhote is working. here is complete bug free code for ASP.NET CORE 2 MVC:
Then use this session in actual controller:
First create class Named mockHttpSession and inherit from ISession.
Then use this session in actual controller: