为 NET7 中的集成测试创建 WebApplication 夹具

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

我想创建 WebApplication 固定装置,以便我可以在集成测试中共享它。看起来就是这样:

public class WebAppFixture : IDisposable
{
    private readonly TestServer _server;

    const string WsHubPath = "/";

    public WebAppFixture()
    {
        var builder = WebApplication.CreateBuilder();

        builder.Services.AddUltraWs()
            .AddWsHub<TestWsHub>();

        var app = builder.Build();

        app.UseWebSockets();
        app.MapUltraWs<TestWsHub>(WsHubPath);

        _server = app.GetTestServer();
        HttpClient = app.GetTestClient();
    }

    public HttpClient HttpClient { get; }
    public Uri WsHubUri => new Uri(_server.BaseAddress + WsHubPath);
    public WebSocketClient CreateWebSocketClient() => _server.CreateWebSocketClient();

    public void Dispose()
    {
        _server.Dispose();
        HttpClient.Dispose();
    }
}

但是当我想在我的测试类中使用它时:

public class WsHubTests : IClassFixture<WebAppFixture>
{
    private readonly WebAppFixture _webAppFixture;

    public WsHubTests(WebAppFixture webAppFixture)
    {
        _webAppFixture = webAppFixture;
    }
}

然后我得到以下异常:

System.AggregateException:发生一个或多个错误。 (无法将类型“Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl”的对象转换为类型“Microsoft.AspNetCore.TestHost.TestServer”。)(以下构造函数参数没有匹配的装置数据:WebAppFixture webAppFixture) ---- System.InvalidCastException:无法将“Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl”类型的对象强制转换为“Microsoft.AspNetCore.TestHost.TestServer”类型。 ---- 以下构造函数参数没有匹配的夹具数据:WebAppFixture webAppFixture

如何解决?我做错了什么?

c# asp.net-core integration-testing xunit fixtures
1个回答
0
投票

您的问题不在于

IClassFixture<WebAppFixture>
和随附的构造函数参数,而在于
WebAppFixture
构造时发生的情况。您发布的错误中给出了出现问题的提示。

(Unable to cast object of type 'Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl' to type 'Microsoft.AspNetCore.TestHost.TestServer'.)

如果您在 WebAppFixture 构造函数中放置断点,并尝试跳过将 GetTestServer 的结果分配给 _server 的行,您将收到未处理的异常

这是因为您使用的是

WebApplication.CreateBuilder()
而不是
WebApplicationFactory<TEntrypoint>
。因此,如果我们检查文档中的一些示例,并稍微修改它们以适应您的情况。

public class WebAppFixture : IDisposable
{
    public readonly HttpClient TestServerClient;

    public WebAppFixture()
    {
        TestServerClient = new WebApplicationFactory<Program>()
            .WithWebHostBuilder(builder =>
            {
                builder.ConfigureAppConfiguration((_, context) =>
                {
                    //context.AddInMemoryCollection();
                });
                builder.ConfigureTestServices(services =>
                {
                    //services.AddTransient<SomeService>();
                });
                builder.UseEnvironment("LOCAL_TEST");
            }).CreateClient();
    }

    public void Dispose()
    {
        TestServerClient.Dispose();
    }
}

您的测试类保持不变,您可以使用

_webAppFixture.TestServerClient

测试您的实现
[Fact]
public async Task TestSomething()
{
    var result = await _webAppFixture.TestServerClient.GetAsync("/WeatherForecast");
    IEnumerable<WeatherForecast> autoParsedResult = await _webAppFixture.TestServerClient.GetFromJsonAsync<IEnumerable<WeatherForecast>>("/WeatherForecast");

    Assert.Equal(System.Net.HttpStatusCode.OK, result.StatusCode);
    Assert.Equal(5, autoParsedResult.Count());
}

您想查看的链接:

在这里您可以阅读有关 ASP.NET Core 中集成测试的所有内容

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