【问题标题】:Resolving dependencies in Integration test in ASP.NET Core解决 ASP.NET Core 集成测试中的依赖关系
【发布时间】:2017-04-17 17:23:36
【问题描述】:

我有 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()方法

【问题讨论】:

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


    【解决方案1】:

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

    var testServer = new TestServer(new WebHostBuilder()
        .UseStartup<Startup>()
        .UseEnvironment("DevelopmentOrTestingOrWhateverElse"));
    
    var myService = testServer.Host.Services.GetRequiredService<IMyService>();
    

    【讨论】:

    • 我使用了 var service = (IMyService)_server.Host.Services.GetService(typeof(IMyService));
    • 同样,扩展方法更方便,因为您不需要强制转换或进行任何空检查(如果服务无法解析,`GetRequiredService 会抛出,因此 名称中需要)
    • 啊它的扩展方法。:) 这就是为什么我在 _server.Host.Services 上找不到它的原因
    • 在错误上点击Ctrl+.会告诉你如何解决它:P
    • 这不是一个通用的方法。您可能没有虚拟主机构建器,而它是一个带有存储库的库,对网络、启动文件等一无所知。但仍应进行测试。
    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2016-08-12
    相关资源
    最近更新 更多