在asp.net core 2.0

时间:2018-01-11 06:11:03

标签: c# unit-testing asp.net-core-2.0

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

测试类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));
        }

2 个答案:

答案 0 :(得分:0)

我认为您需要为生产和测试创建不同的Startup类。 然后必要的Startup将选择&#34;取决于当前的构建。 例如:

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();

<强>更新

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

Example you can see here

答案 1 :(得分:0)

自ASP Core 2.1以来,ConfigureTestServices上有一个WebHostBuilder方法可用,该方法在从Startup.cs注册后运行。因此您的代码将如下所示:

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