我正在使用 Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions 中的
SignOutAsync
。
在我的单元测试中,我在该扩展方法中的某处得到一个
ArgumentNullException
,它表示
值不能为空。 (参数“提供者”)
我没有直接提供“provider”,所以我假设扩展方法是从 HttpContext 构建它。
我的测试中的 HttpContext 是使用 Moq 创建的:
var httpContext = new Mock<HttpContext>();
有没有办法让我的模拟为“provider”提供值?我是否需要切换到 DefaultHttpContext,并为
ServiceScopeFactory
提供值? (很棘手,因为 DefaultHttpContext 不可模拟。)
如果您查看源代码,
SignOutAsync
最终会尝试调用私有方法GetAuthenticationService
,并尝试调用context.RequestServices.GetService<IAuthenticationService>()
。
通用
GetService
是一种扩展方法,因此您的 null provider
实际上是 RequestServices
。 RequestServices
是 HttpContext
的抽象,因此它将由 Moq 实现,并且默认情况下在松散模拟上,只会返回 null。哎呀,你的崩溃了。
所以,可以设置它:
IServiceProvider serviceProvider = /*...*/;
httpContext.SetupGet(x => x.RequestServices).Returns(serviceProvider);
但是到那时你就可以使用
DefaultHttpContext
和 set 提供者:
var httpContext = new DefaultHttpContext
{
RequestServices = serviceProvider
};
现在你需要做的就是嘲笑服务提供商。为此,请参阅这个问题。