模拟 HttpContext 时,SignOutAsync 失败

问题描述 投票:0回答:1

我正在使用 Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions 中的

SignOutAsync

在我的单元测试中,我在该扩展方法中的某处得到一个

ArgumentNullException
,它表示

值不能为空。 (参数“提供者”)

我没有直接提供“provider”,所以我假设扩展方法是从 HttpContext 构建它。

我的测试中的 HttpContext 是使用 Moq 创建的:

var httpContext = new Mock<HttpContext>();

有没有办法让我的模拟为“provider”提供值?我是否需要切换到 DefaultHttpContext,并为

ServiceScopeFactory
提供值? (很棘手,因为 DefaultHttpContext 不可模拟。)

c# unit-testing moq httpcontext
1个回答
0
投票

如果您查看源代码

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
};

现在你需要做的就是嘲笑服务提供商。为此,请参阅这个问题

© www.soinside.com 2019 - 2024. All rights reserved.