2015-04-23 2 views
1

Я играю с простым обработчиком, который реализует IWantToRunWhenBusStartsAndStops и в начале, это расписанием задачу следующим образом:Как проверить обработчик NServiceBus, который использует расписание

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

_schedule впрыскивается через конструктор. Тест, который я пытаюсь написать, - это удостовериться, что задача запланирована при запуске обработчика. Но я не могу найти способ издеваться над расписанием, поскольку у него нет конструктора no-arg и он не реализует интерфейс. Я попытался создать фактический экземпляр этого с издеваемым IBuilder, но не могу понять, какие ожидания установить на IBuilder. Кроме того, я посмотрел на источник, чтобы узнать, как они тестировали Schedule, но похоже, что мы находимся на более ранней версии (v5.0.0 через nuget), потому что у нас нет DefaultScheduler, который, по-видимому, используется ими в их нынешнем тесты.

+0

С моей точки зрения, вы пытаетесь протестировать инфраструктуру, которая сама по себе является анти-шаблоном. Кроме того, инъекция статического NServiceBus.Schedule является излишним. Я не могу себе представить, почему кто-то это сделает. –

+0

@AlexeyZimarev I упрощен. Это делает больше, чем это, но одна из целей теста - проверить, что, да, мы запланировали метод, который будет выполняться каждые пять секунд. Кроме того, расписание больше не статично в версии 5. Он вводится через контейнер. (http://docs.particular.net/nservicebus/scheduling/) –

ответ

1

На самом деле команда NServiceBus уже покрыла планировщик приемочным тестом/приемочным испытанием, то есть нет необходимости проверять, действительно ли задание было запланировано, когда выполняется ваш обработчик. Вместо этого вы, вероятно, захотите, чтобы блок самостоятельно тестировал ваш обработчик, поэтому проверьте, вызван ли вызов scheduler.Every(). Вот простой пример того, как ваше модульное тестирование может выглядеть следующим образом:

[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); 
    } 
} 

Самого обработчик:

class TestHandler: IWantToRunWhenBusStartsAndStops 
{ 
    readonly IMyScheduler _scheduler; 

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

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

    public void Stop() { } 
} 

Наконец, вы должны абстрагироваться от прямого использования NServiceBus планировщика для того, чтобы сделать его проверяемым, вот идея:

interface IMyScheduler 
{ 
    void Every(TimeSpan interval, Action action); 
} 

//your real implementation 
class MySheduler: IMyScheduler 
{ 
    readonly Schedule _schedule; 

    public MySheduler(Schedule schedule) 
    { 
     _schedule = schedule; 
    } 

    public void Every(TimeSpan interval, Action action) 
    { 
     _schedule.Every(TimeSpan.FromSeconds(5),() => { }); 
    } 
} 

//fake for the testing 
class FakeSheduler: IMyScheduler 
{ 
    public bool WasCalled { get; set; } 

    public void Every(TimeSpan interval, Action action) 
    { 
     WasCalled = true; 
    } 
} 
+0

Спасибо, Борис. Это, в конечном счете, маршрут, который мы отправили, который по сути сводит их Планировщик с нашей собственной. Я нашел тестовый блок NSB для Планировщика, но он полагается на класс DefaultScheduler, который отсутствует в нашей версии NSB. –

Смежные вопросы