编写单元测试¶
我不会告诉你有关后台任务的单元测试的任何内容,因为Hangfire没有添加任何特定方法 (除了 IJobCancellationToken 接口参数)去改变任务。使用您最喜爱的工具,并照常写入单元测试。本节介绍如何测试创建的后台任务。
所有的代码示例都使用静态 BackgroundJob 类来告诉你如何做这个或那些东西,只是出于简单演示的目的。但是当你想测试调用的静态方法时,会变得很痛苦。
不用担心 - BackgroundJob 类只是 IBackgroundJobClient 接口及其默认实现 BackgroundJobClient 类的一个入口。如果要编写单元测试,请使用它们。例如,假设在以下控制器入队一个后台任务:
- public class HomeController : Controller
- {
- private readonly IBackgroundJobClient _jobClient;
- // For ASP.NET MVC
- public HomeController()
- : this(new BackgroundJobClient())
- {
- }
- // For unit tests
- public HomeController(IBackgroundJobClient jobClient)
- {
- _jobClient = jobClient;
- }
- public ActionResult Create(Comment comment)
- {
- ...
- _jobClient.Enqueue(() => CheckForSpam(comment.Id));
- ...
- }
- }
很简单,对吧。现在你可以使用任何 mocking 框架, 如提供mocks和检查调用的 Moq 。 IBackgroundJobClient 接口仅提供 Create 方法来创建后台任务并实例化对应的类。通过 Job 类的实例了解后台任务的信息,通过 IState 接口了解后台任务的状态。
- [TestMethod]
- public void CheckForSpamJob_ShouldBeEnqueued()
- {
- // Arrange
- var client = new Mock<IBackgroundJobClient>();
- var controller = new HomeController(client.Object);
- var comment = CreateComment();
- // Act
- controller.Create(comment);
- // Assert
- client.Verify(x => x.Create(
- It.Is<Job>(job => job.Method.Name == "CheckForSpam" && job.Args[0] == comment.Id),
- It.IsAny<EnqueuedState>());
- }
Note
job.Method 属性仅适用于后台任务的方法信息。如果您还想检查类型名称,请使用 job.Type 属性。
原文:
http://hangfirezh.zhs.press/background-methods/writing-unit-tests.html