0

我正在尝试将我的集成测试从.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>();
    }
4

1 回答 1

0

发现了TryAddTransient的存在,它可以完成这项工作,但感觉有点像 hack。

于 2021-11-18T12:17:25.427 回答