我正在使用一个实现IWantToRunWhenBusStartsAndStops
的简单处理程序,并且在开始时,它会按如下方式安排任务:
public void Start()
{
_schedule.Every(TimeSpan.FromSeconds(5), Moo);
}
_schedule是通过构造函数注入的。我尝试写入的测试是确保在处理程序启动时安排任务。但我无法找到一种模拟Schedule的方法,因为它没有一个无参数的构造函数,并且它没有实现一个接口。我尝试使用模拟的IBuilder
创建一个实际的实例,但无法确定在IBuilder
上设置的期望值。另外,我查看了源代码,看看他们是如何测试的Schedule
,但看起来我们是在早期版本(v5.0.0 via nuget),因为我们没有{{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() { }
}