代码之家  ›  专栏  ›  技术社区  ›  ryanthescot

如何在AspNetCore上模拟AuthenticateAsync。身份验证。摘要

  •  5
  • ryanthescot  · 技术社区  · 7 年前

    我在控制器上有一个动作,它调用

    var result = await HttpContext.AuthenticateAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme);
    

    我试图在这样的单元测试中模拟这个结果

    httpContextMock.AuthenticateAsync(Arg.Any<string>()).Returns(AuthenticateResult.Success(...
    

    然而,这带来了一个 InvalidOperationException

    “尚未注册“Microsoft.AspNetCore.Authentication.IAAuthenticationService”类型的服务”

    模仿这种方法的正确方法是什么?

    1 回复  |  直到 5 年前
        1
  •  8
  •   Nkosi    7 年前

    那个 extension method

    /// <summary>
    /// Extension method for authenticate.
    /// </summary>
    /// <param name="context">The <see cref="HttpContext"/> context.</param>
    /// <param name="scheme">The name of the authentication scheme.</param>
    /// <returns>The <see cref="AuthenticateResult"/>.</returns>
    public static Task<AuthenticateResult> AuthenticateAsync(this HttpContext context, string scheme) =>
        context.RequestServices.GetRequiredService<IAuthenticationService>().AuthenticateAsync(context, scheme);
    

    通过 IServiceProvider RequestServices 所有物

    /// <summary>
    /// Gets or sets the <see cref="IServiceProvider"/> that provides access to the request's service container.
    /// </summary>
    public abstract IServiceProvider RequestServices { get; set; }
    

    模拟服务提供商以返回模拟的 IAuthenticationService 你应该能够通过考试假装通过考试。

    authServiceMock.AuthenticateAsync(Arg.Any<HttpContext>(), Arg.Any<string>())
        .Returns(Task.FromResult(AuthenticateResult.Success()));
    providerMock.GetService(typeof(IAuthenticationService))
        .Returns(authServiceMock);
    httpContextMock.RequestServices.Returns(providerMock);
    
    //...