集成测试与2个后台服务

时间:2020-06-16 08:19:34

标签: c# .net-core integration-testing xunit background-service

我有一个点网核心项目,试图在我的两个BackgroundServices之间编写集成测试。

以下是我当前的xUnit测试:

[Fact]
public async Task FileWatcherIntegration()
{
    IServiceCollection services = new ServiceCollection();
    services.AddHostedService<FileWatcherService>();
    services.AddHostedService<FailedTradesWorker>();
    services.AddSingleton(fileWatcherOptions);
    services.AddSingleton<ILogger<FileWatcherService>>(logger);

    var serviceProvider = services.BuildServiceProvider();


    var fileWatcher = serviceProvider.GetService<IHostedService>() as FileWatcherService; 
    var tradeWorker = serviceProvider.GetService<IHostedService>() as FailedTradesWorker;

    // act
    await tradeWorker.StartAsync(CancellationToken.None);
    await fileWatcher.StartAsync(CancellationToken.None);

    /* Ommited */


    await tradeWorker.StopAsync(CancellationToken.None);
    await fileWatcher.StopAsync(CancellationToken.None);

    // assert
    Assert.True(File.Exists(fileWatcherOptions.DestinationPathAndName));
}

我的测试在var fileWatcher = serviceProvider.GetService<IHostedService>() as FileWatcherService;行失败,并显示错误消息:Unable to resolve service for type

为此测试设置服务的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

这看起来很奇怪:

subdf.plot(ax=axs[i//4, i%4], 
           column='Property crime rate',
           cmap='RdBu_r',
           cax=cax,
           legend=True,
           vmin=1700,
           vmax=4100
          )

我会使用一个服务提供商,并且会按服务类型获得服务:

var serviceProvider = services.BuildServiceProvider();
var tradeServiceProdiver = tradeServices.BuildServiceProvider();

var fileWatcher = serviceProvider.GetService<IHostedService>() as FileWatcherService; 
var tradeWorker = serviceProvider.GetService<IHostedService>() as FailedTradesWorker;

或者我会创建可以像这样使用的接口:

var serviceProvider = services.BuildServiceProvider();

var fileWatcher = serviceProvider.GetService<FileWatcherService>();
var tradeWorker = serviceProvider.GetService<FailedTradesWorker>();

答案 1 :(得分:0)

使用GetServices<IHostedService>()

解析所有已注册的服务主机

这将返回一个IEnumerable<IHostedService>。从那里开始,只需启动服务即可。

以下方法获取所有启动和停止任务,并使用Task.WhenAll等待它们

[Fact]
public async Task FileWatcherIntegration() {
    // Arrange
    IServiceCollection services = new ServiceCollection();
    services.AddHostedService<FileWatcherService>();
    services.AddHostedService<FailedTradesWorker>();
    services.AddSingleton(fileWatcherOptions);
    services.AddSingleton<ILogger<FileWatcherService>>(logger);

    IServiceProvider serviceProvider = services.BuildServiceProvider();

    IEnumerable<IHostedService> hosts = serviceProvider.GetServices<IHostedService>();

    // Act
    await Task.WhenAll(hosts.Select(host => host.StartAsync(CancellationToken.None)));

    /* Ommited */

    await Task.WhenAll(hosts.Select(host => host.StopAsync(CancellationToken.None)));

    // Assert
    Assert.True(File.Exists(fileWatcherOptions.DestinationPathAndName));
}