- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在 .net core 2.0 启动时启动的后台任务,从 backgroundservice 继承,实现了 StartAsync、StopAsync 和 ExecuteAsync。这个任务是根据一些业务逻辑定期更新数据库表中的一些数据。
虽然我可以将后台任务作为应用程序运行并使用日志、数据库检查和其他工具的帮助进行测试,但单元测试是否是测试后台任务所必需的?如果是这样,如何将任务注册为具有依赖项的服务并触发 start 和 stop 方法来断言实际与预期?欣赏一些基本的示例单元测试方法,用于测试基于 .net 核心 ihostedservice 后台任务的计时器。
这是我的基本测试开始,仅用于示例,但尚未完成。话虽如此,这只是一个想法,而不是确切的工作测试。这是需要社区帮助的地方。还可以添加更多断言,即 Assert.Verify()?
[Fact]
public async void Run_background_task_success()
{
//Arrange
IServiceCollection services = new ServiceCollection();
services.AddHostedService<BackgroundManagerTask>();
var serviceProvider = services.BuildServiceProvider();
var service = serviceProvider.GetService<IHostedService>() as BackgroundManagerTask;
var isExecuted = false;
if(await service.StartAsync(CancellationToken.None))
{
isExecuted = true;
}
await Task.Delay(10000);
Assert.True(isExecuted);
await service.StopAsync(CancellationToken.None);
}
最佳答案
这是我通常的做法。你提到你要去数据库更新一些数据,所以我假设你期望这是来自 BackgroundManager
的依赖。
[Fact]
public void BackgroundManagerUpdatingDataTest()
{
// Arrange
Mock<IDataAccess> dbMock = new Mock<IDataAccess>();
dbMock.Setup(x => x.UpdateSomethingInDB(It.IsAny<BusinessObject>())).Returns(1); // One row updated from the DML in UpdateSomethingInDB from the BusinessObject
BackgroundManager sut = new BackgroundManager(dbMock.Object); // System under test.
// Act
await sut.StartAsync(CancellationToken.None);
await Task.Delay(500); // Give the test some time to execute.
await sut.StopAsync(CancellationToken.None); // Stop the Background Service.
// Assert
dbMock.Verify(x => x.UpdateSomethingInDB(It.IsAny<BusinessObject>()), Times.Exactly(1));
}
上面,我们通过 Mocking 数据访问调用并验证它被调用了一次来简单地测试对数据库的更新。
关于unit-testing - 在 .net 核心 Ihostedservice 上编写单元测试的好做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54627665/
下面是我运行 IHostedService 的简单代码 internal class Program { public static Task Main(string[] args) {
我正在尝试向 IHostedService 添加配置值,但不知道如何操作。 这是我目前拥有的: 启动 services.Configure(Configuration.GetSection("MyOp
我正在尝试向 IHostedService 添加配置值,但不知道如何操作。 这是我目前拥有的: 启动 services.Configure(Configuration.GetSection("MyOp
我正在尝试在 .NET Core 中开发一个允许异步处理请求的简单 API。 请求发送给 Controller 安排在后台服务 (IHostedService) 上的工作 Controller 返回
我正在尝试使用 IHostedService 创建后台服务。如果我只有一个后台服务,一切都很好。当我尝试创建多个 IHostedService 的实现时只有最先注册的才真正运行。 services.A
谁能向我解释为什么我的服务器无缘无故停止?在我的 IHostedService 实现下面: public class HostServiceBox : IHostedService {
我知道这是一个设计问题,但我试图理解这一点以最好的方式使用它。因此,请将此问题视为对如何使用其最大功能的澄清。 为什么它没有设计基于 KISS 的同步和异步方法( StartAsync , StopA
我不知道如何访问我的 ConsoleHostedService 实现类中的命令行参数。我在源代码中看到 CreateDefaultBuilder(args) 以某种方式将其添加到配置中...命名为 A
我不知道如何访问我的 ConsoleHostedService 实现类中的命令行参数。我在源代码中看到 CreateDefaultBuilder(args) 以某种方式将其添加到配置中...命名为 A
有没有办法配置.net core/autofac等待HostedService完成启动? 简单的例子 #define useAutofac public class Startup { #if use
ASP.NET Core 2.0 documentation定义 IHostedService 接口(interface)如下: StartAsync(CancellationToken) - Cal
这个问题是关于在 IIS 上运行的 ASP.NET Core 2.2 应用程序,特别是在注册 IHostedService 的实例时。与 DI 容器。 我阅读的每篇文章 IHostedService.
我知道一个 IHostedService只运行一次听起来像一个控制台应用程序,但我想使用它而不是一个普通的控制台应用程序的原因是: .net core 介绍 Generic Host用于运行非 htt
我有一个 .NET Core 3.1 应用程序,它提供一个描述应用程序运行状况的端点,以及一个处理数据库中数据的 IHostedService。 但是有一个问题,HostedService 的工作函数
我在 DI 容器中注册了多个 IHostedService (BackgroundService) 实例。 services.AddHostedService(); services.AddHoste
我在 DI 容器中注册了多个 IHostedService (BackgroundService) 实例。 services.AddHostedService(); services.AddHoste
我在 .netcore 2.2 中构建了通用主机 (IHostedService)。我将 HostBuilder 作为 RunConsoleAsync() 运行。RunConsoleAync() 将等
我正在构建一个 IHostedService 实现。我的服务做了一些事情,这些事情应该在服务终止时处理,比如在 StartAsync() 中向外部服务注册一些事件处理程序。 现在我想知道,我应该在哪里
.net核心BackgroundService或 IHostedService的 start 方法是异步的: //IHostedService Task StartAsync(Cancellation
无论我们是否应该,我们可以在 Azure Functions 应用程序中使用 IHostedService 吗? 以下尝试将托管服务(特别是后台服务)注册为 IHostedService: inter
我是一名优秀的程序员,十分优秀!