编写单元测试¶

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

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

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

  1. publicclassHomeController:Controller
    {
    privatereadonlyIBackgroundJobClient_jobClient;

    // For ASP.NET MVC
    publicHomeController()
    :this(newBackgroundJobClient())
    {
    }

    // For unit tests
    publicHomeController(IBackgroundJobClientjobClient)
    {
    _jobClient=jobClient;
    }

    publicActionResultCreate(Commentcomment)
    {

    _jobClient.Enqueue(()=>CheckForSpam(comment.Id));

    }
    }


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


  1. [TestMethod]
    publicvoidCheckForSpamJob_ShouldBeEnqueued()
    {
    // Arrange
    varclient=newMock<IBackgroundJobClient>();
    varcontroller=newHomeController(client.Object);
    varcomment=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[TOC]