2017-04-17 47 views
2

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

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

回答

4

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

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

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

我用变种服务=(IMyService)_server.Host.Services.GetService(typeof运算(IMyService)); – LP13

+0

这是一样的,扩展方法更方便,因为您不需要进行强制类型转换或执行任何空值检查(如果服务无法解析,则返回GetRequiredService,因此名称中必须包含**) – Tseng

+0

:)这就是为什么我无法找到它_server.Host.Services',帮助 – LP13