我想创建 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
如何解决?我做错了什么?
您的问题不在于
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());
}
您想查看的链接: