我正在尝试将我的集成测试从.NET 5 中WebApplicationFactory
移到TestServer
。在我现有的实现中,我可以覆盖ConfigureWebHost
并调用IWebHostBuilder.ConfigureServices
以用模拟替换服务实现。这在Startup
代码之后运行,允许我删除生产实现并添加模拟。
当尝试使用 实现相同的事情TestServer
时,ConfigureServices
总是在代码之前运行,无论Startup
我以哪种顺序进行配置,这意味着我总是在服务集合中同时使用这两种实现,并且似乎“最后一个获胜”,即 prod 版本的服务始终运行。
如何配置构建器以使用我的测试版本?
我正在使用 XUnit,所以可能没有以正确的方式使用它IClassFixture
等等。
这是我的代码:
public sealed class IntegrationTests : IDisposable
{
private TestServer Server { get; }
private HttpClient Client { get; }
public IntegrationTests()
{
var builder = new WebHostBuilder()
.UseConfiguration(new ConfigurationBuilder().AddJsonFile("appsettings.development.json").Build())
.UseSerilog()
// Changing the order of the following two lines doesn't help
.UseStartup<Startup>()
.ConfigureServices(UseDummyUserRepository);
Server = new TestServer(builder);
Client = Server.CreateClient();
}
private void UseDummyUserRepository(IServiceCollection services)
{
//Following line doesn't work as the service is not yet configured
//services.Remove(services.First(s => s.ServiceType == typeof(IUserRepository)));
services.AddTransient<IUserRepository, DummyUserRepository>();
}