c# - 使用 2 个后台服务进行集成测试
问题描述
我有一个 dot net core 项目,我正在尝试在我的两个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
为该测试设置我的服务的正确方法是什么?
解决方案
这看起来很奇怪:
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>();
或者我会创建可以像这样使用的接口:
public interface IFileWatcherService : IHostedService
{
...
}
public interface IFailedTradesWorker : IHostedService
{
...
}
services.AddHostedService<IFileWatcherService, FileWatcherService>();
services.AddHostedService<IFailedTradesWorker, FailedTradesWorker>();
var fileWatcher = serviceProvider.GetService<FileWatcherService>();
var tradeWorker = serviceProvider.GetService<FailedTradesWorker>();
推荐阅读
- .htaccess - 用参数重写 URL
- qt - 为什么罕见实例上的 Qt3DWindow 不渲染场景,而是将 GUI 的其他部分投影到窗口上?
- libgdx - 需要帮助优化 LibGDX、SpriteBatch 上的纹理绘制
- elasticsearch - 无法从 minikube 集群内的 webapp 访问 NodePort 服务,但可以从外部访问
- python - Python 在 PostgreSQL 查询上使用多处理减少了运行时间
- python - 如何免费将带有 Kivy 的 python 文件上传到 iPhone?
- java - 当在 onCreate 中完成某些事情(不是声明或初始化)但在 onClick 中没有完成时,应用程序崩溃
- c++ - Qt WebEngineView:加载 WebGL 项目时出现问题(从 Unity 导出)
- java - 使用 Kotlin 解析多列文件
- couchbase - 如何在n1ql查询中检索父母的孩子