解决ASP.NET Core中的Integration测试中的依赖关系

时间:2017-04-17 17:23:37

标签: asp.net-core asp.net-core-mvc xunit coreclr

我有ASP.NET Core API。我已经阅读了文档here,该文档展示了如何在asp.net核心中进行集成测试。该示例设置测试服务器,然后调用控制器方法 但是我想直接测试一个特定的类方法(不是控制器方法)?例如:

  public class MyService : IMyService
  {
      private readonly DbContext _dbContext;

      public MyService(DbContext dbContext)
      {
          _dbContext = dbContext;
      }

      public void DoSomething()
      {
          //do something here
      }             
  }

当测试开始时,我希望调用startup.cs,以便所有依赖项都会被注册。 (比如dbcontext)但我不确定在集成测试中如何解决IMyService

注意:我想直接测试DoSomething()方法的原因是因为任何控制器都不会调用此方法。我在此API中使用Hangfire进行后台处理。 Hangfire的后台处理作业将调用DoSomething()方法。因此,对于集成测试,我希望避免使用Hangfire并直接调用DoSomething()方法

1 个答案:

答案 0 :(得分:8)

运行集成测试时,您已经有TestServer,从此处可以轻松访问应用程序范围的容器。由于显而易见的原因,您无法访问RequestServices(它仅在HttpContext中可用,每次请求创建一次)。

var testServer = new TestServer(new WebHostBuilder()
    .UseStartup<Startup>()
    .UseEnvironment("DevelopmentOrTestingOrWhateverElse"));

var myService = testServer.Host.Services.GetRequiredService<IMyService>();