![](/img/trans.png)
[英].net core 3.0, Service not register using HostBuilder for Integration Tests
[英]Create unauthenticated request in integration tests in .NET Core 3.0
.NET Core 2.2 有一個很好的解決方案https://stackoverflow.com/a/50247041
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureTestServices(services =>
{
services
.AddMvc(opts => opts.Filters.Add(new AllowAnonymousFilter()));
});
}
顯然它在 .NET Core 3.0 中停止工作
錯誤消息:預期 response.StatusCode 正常,但發現未授權。 堆棧跟蹤:在 FluentAssertions.Execution.TestFrameworkProvider.Throw(String message) 在 FluentAssertions.Execution.DefaultAssertionStrategy.HandleFailure(String message) 在 FluentAssertions.Execution.AssertionScope.FailWith(Func' 的 FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) 1 failReasonFunc) 在 FluentAssertions.Execution.AssertionScope.FailWith(Func'1 failReasonFunc) 在 FluentAssertions.Execution.AssertionScope.FailWith(String message, Object[] args) 在 FluentAssertions.Primitives.ObjectAssertions.Be(Object expected, String because, Object [] 因為Args)
有誰知道新的 .NET Core 是否有類似的解決方法?
我在 .NET Core 2.2 下使用了相同的方法。 我最終發現適用於 .NET Core 3.0 的是基於Integration Tests - Mock Authentication 。 我添加了一個模擬測試身份驗證處理程序,如下所示:
public class TestAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public TestAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
: base(options, logger, encoder, clock)
{
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var claims = new[] { new Claim(ClaimTypes.Name, "Test user") };
var identity = new ClaimsIdentity(claims, "Test");
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, "Test");
AuthenticateResult result = AuthenticateResult.Success(ticket);
return Task.FromResult(result);
}
}
然后在ConfigureTestServices
我改變了邏輯
services.AddControllers(options =>
{
options.Filters.Add(new AllowAnonymousFilter());
});
添加身份驗證並覆蓋授權策略,如下所示:
services
.AddAuthentication("Test")
.AddScheme<AuthenticationSchemeOptions, TestAuthHandler>("Test", options => { });
services.AddAuthorization(options =>
{
options.AddPolicy("<Existing Policy Name>", builder =>
{
builder.AuthenticationSchemes.Add("Test");
builder.RequireAuthenticatedUser();
});
options.DefaultPolicy = options.GetPolicy("<Existing Policy Name>");
});
這現在允許我的測試在 .NET Core 3.0 下工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.