首页 文章

在asp.net core 2.0中的Integration测试的Startup类中为IServiceCollection添加附加服务

提问于
浏览
0

我想在我的Integration测试项目的IServiceCollection对象中添加一些Service到Startup.cs . 我在我的集成测试中在WebHostBuilder的ConfigureServices方法中添加了我的TestConfigration,但是在我的启动类之前调用了它,因此我的测试配置被覆盖了 .

Test class TestSetup.cs

var builder = new WebHostBuilder()
                .UseEnvironment("development")
                .UseContentRoot(contentRoot)
                  .ConfigureServices(TestConfigureServices)
                .UseStartup<Startup>();



 private void TestConfigureServices(IServiceCollection serviceCollection)
        {
            serviceCollection.AddSingleton((c) =>
                new TokenClient(TokenEndpoint,
                                "api.public.client",
                                "psdfsrfsdf",
                                innerHttpMessageHandler: _handler));
        }

API Project Startup.cs

public void ConfigureServices(IServiceCollection services)
        {
services.AddSingleton((b) =>
                new TokenClient(m.AccessTokenUrl,
                                SecurityConfig.PublicApiClientId,
                                SecurityConfig.PublicApiClientPassword));
        }

1 回答

  • 0

    我认为您需要为 生产环境 和测试创建不同的 Startup 类 . 然后必要 Startup 将"choosen"取决于当前构建 . 例:

    public class Startup  
    {    
      public void ConfigureServices(IServiceCollection services)
      {    
        services.AddTransient<IYourService, YourService>();
      }
    }
    
    public class StartupTesting  
    {    
      public void ConfigureServices(IServiceCollection services)
      {   
        services.AddTransient<IYourService, YourMockedService>();
      }
    }
    
    
    var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;
    //var assemblyName = typeof(StartupTesting).GetTypeInfo().Assembly.FullName;
    
    var host = new WebHostBuilder()  
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup(assemblyName)
        .Build();
    
    host.Run();
    

    Updated:

    还有第二种方法 - 在一个Startup类中使用特定于环境的方法 . 但我的拙见是,这导致了测试和登台代码之间过多的耦合 .

    Example you can see here

相关问题