I want to Unit Test my Controller, but I'm having issues reading values from HttpContext.Session.
I want to mock this piece from my Controller: HttpContext.Session.Get<int>(Foo)
With Mock HttpContext for unit testing a .NET core MVC controller? and How to mock Session Object in asp net core I was able to come to the following solution:
My Test:
public void GetFoos_AllGood_ReturnList()
{
//Arrange
Mock<ISession> sessionMock = new Mock<ISession>();
var fooSessionValue = new byte[0];
Web.Controllers.FooController fooController = new Web.Controllers.FooController();
fooController.ControllerContext.HttpContext = new DefaultHttpContext();
fooController.ControllerContext.HttpContext.Request.Headers["Foo"] = 0;
Mock<IServiceCollection> mock = new Mock<IServiceCollection>();
mock.Object.AddSession(); // Tried this, but failed
//Setup
sessionMock.Setup(_ => _.Set("Foo", It.IsAny<byte[]>())).Callback<string, byte[]>((k, v) => fooSessionValue = v);
sessionMock.Setup(_ => _.TryGetValue("Foo", out fooSessionValue)).Returns(true);
mockWebDataManager.Setup(b => b.GetFoos(It.IsAny<FooArgs>())).Returns(new FooResult() { Foos = new List<Foo>() });
//Act
var result = fooController.GetFoos() as JsonResult;
//Assert
Assert.NotNull(result);
Assert.Equal(200, result.StatusCode);
}
My Controller:
internal virtual DataArgs CreateArgs()
{
return new FooArgs
{
HttpContext.Session.Get<int>(Foo) // I want to Mock this value
};
}
[HttpGet]
public IActionResult GetFoos()
{
FooArgs args = CreateArgs();
...
}
If anyone faces the same issue one day, here you go:
public void GetFoos_AllGood_ReturnList()
{
//Arrange
Mock<ISession> sessionMock = new Mock<ISession>();
Web.Controllers.FooController fooController = new Web.Controllers.FooController();
fooController.ControllerContext.HttpContext = new DefaultHttpContext();
fooController.ControllerContext.HttpContext.Request.Headers["Foo"] = 0;
fooController.ControllerContext.HttpContext.Session = sessionMock.Object;
//Act
var result = fooController.GetFoos() as JsonResult;
//Assert
Assert.NotNull(result);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With