如何测试使用Schedule的NServiceBus处理程序

时间:2015-04-23 16:20:26

标签: nservicebus

我正在使用一个实现IWantToRunWhenBusStartsAndStops的简单处理程序,并且在开始时,它会按如下方式安排任务:

    public void Start()
    {
        _schedule.Every(TimeSpan.FromSeconds(5), Moo);
    }

_schedule是通过构造函数注入的。我尝试写入的测试是确保在处理程序启动时安排任务。但我无法找到一种模拟Schedule的方法,因为它没有一个无参数的构造函数,并且它没有实现一个接口。我尝试使用模拟的IBuilder创建一个实际的实例,但无法确定在IBuilder上设置的期望值。另外,我查看了源代码,看看他们是如何测试的Schedule,但看起来我们是在早期版本(v5.0.0 via nuget),因为我们没有{{1这似乎是他们在当前测试中使用的内容。

1 个答案:

答案 0 :(得分:1)

事实上,NServiceBus团队已经使用单元/验收测试覆盖了调度程序,即在执行处理程序时无需检查任务是否已实际调度。相反,您可能希望对处理程序本身进行单元测试,从而检查是否已调用scheduler.Every()。以下是单元测试的简单示例:

JAVA_HOME='/opt/jdk/jdk1.7.0_75'

处理程序本身:

[TestClass]
public class Tests
{
    [TestMethod]
    public void When_executing_handler_the_task_should_be_scheduled()
    {
        //arrange
        var scheduler = new FakeSheduler();

        //act
        var handler = new TestHandler(scheduler);
        handler.Start();

        //assert
        Assert.IsTrue(scheduler.WasCalled);
    }
}

最后,您必须从NServiceBus调度程序的直接使用中抽象出来以使其可测试,这是一个想法:

class TestHandler: IWantToRunWhenBusStartsAndStops
{
    readonly IMyScheduler _scheduler;

    public TestHandler(IMyScheduler scheduler)
    {
        _scheduler = scheduler;
    }

    public void Start()
    {
        _scheduler.Every(TimeSpan.FromSeconds(5), () => { });
    }

    public void Stop() { }
}