我有一个点网核心项目,试图在我的两个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
为此测试设置服务的正确方法是什么?
答案 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));
}