编写单元测试¶

我不会告诉你有关后台任务的单元测试的任何内容,因为Hangfire没有添加任何特定方法 (除了 IJobCancellationToken 接口参数)去改变任务。使用您最喜爱的工具,并照常写入单元测试。本节介绍如何测试创建的后台任务。

所有的代码示例都使用静态 BackgroundJob 类来告诉你如何做这个或那些东西,只是出于简单演示的目的。但是当你想测试调用的静态方法时,会变得很痛苦。

不用担心 - BackgroundJob 类只是 IBackgroundJobClient 接口及其默认实现 BackgroundJobClient 类的一个入口。如果要编写单元测试,请使用它们。例如,假设在以下控制器入队一个后台任务:

  1. public class HomeController : Controller
  2. {
  3. private readonly IBackgroundJobClient _jobClient;
  4.  
  5. // For ASP.NET MVC
  6. public HomeController()
  7. : this(new BackgroundJobClient())
  8. {
  9. }
  10.  
  11. // For unit tests
  12. public HomeController(IBackgroundJobClient jobClient)
  13. {
  14. _jobClient = jobClient;
  15. }
  16.  
  17. public ActionResult Create(Comment comment)
  18. {
  19. ...
  20. _jobClient.Enqueue(() => CheckForSpam(comment.Id));
  21. ...
  22. }
  23. }

很简单,对吧。现在你可以使用任何 mocking 框架, 如提供mocks和检查调用的 MoqIBackgroundJobClient 接口仅提供 Create 方法来创建后台任务并实例化对应的类。通过 Job 类的实例了解后台任务的信息,通过 IState 接口了解后台任务的状态。

  1. [TestMethod]
  2. public void CheckForSpamJob_ShouldBeEnqueued()
  3. {
  4. // Arrange
  5. var client = new Mock<IBackgroundJobClient>();
  6. var controller = new HomeController(client.Object);
  7. var comment = CreateComment();
  8.  
  9. // Act
  10. controller.Create(comment);
  11.  
  12. // Assert
  13. client.Verify(x => x.Create(
  14. It.Is<Job>(job => job.Method.Name == "CheckForSpam" && job.Args[0] == comment.Id),
  15. It.IsAny<EnqueuedState>());
  16. }

Note

job.Method 属性仅适用于后台任务的方法信息。如果您还想检查类型名称,请使用 job.Type 属性。

原文:

http://hangfirezh.zhs.press/background-methods/writing-unit-tests.html