在单元测试注销功能时,简单地将Mock HttpContext传递到控制器上下文将引发以下错误HttpContext.Signout+值不能为null(参数"provider"(
var mockHttpContext = new Mock<HttpContext>();
//设置控制器HttpContext
_controller.ControllerContext.HttpContext = mockHttpContext.Object;
//现在调用注销操作方法和测试结果
如果深入到SigOutAsync代码的定义,则需要不应为null的Authentication Service Provider。因此,除了模拟HttpContext,您还需要模拟将解决问题的服务提供商。
//mock the Http Context along with Service provider
var mockHttpContext = new Mock<HttpContext>();
var authServiceMock = new Mock<IAuthenticationService>();
authServiceMock.Setup(_ => _.SignOutAsync(It.IsAny<HttpContext>(), It.IsAny<string>(),It.IsAny<AuthenticationProperties>())).Returns(Task.FromResult((object)null));
var serviceProviderMock = new Mock<IServiceProvider>();
serviceProviderMock.Setup(_ => _.GetService(typeof(IAuthenticationService)))
.Returns(authServiceMock.Object);
mockHttpContext.Setup(x => x.RequestServices)
.Returns(serviceProviderMock.Object);
//set the controller HttpContext
_controller.ControllerContext.HttpContext = mockHttpContext.Object;
// Now call the Logout and Test
在测试SignIn功能时可以应用类似的逻辑
也可以参考这里-如何对HttpContext.SignInAsync((进行单元测试?