Концентратор событий модульного теста EventProcessor

В настоящее время я изучаю центр событий Microsoft и следил за примером кода здесь. Я изменил метод ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events), так что теперь, когда я получаю EventData, я сохраняю его в базе данных. На данный момент я хочу использовать модульный тест для тестирования своего кода. В тестовом классе я настраиваю отправителя и отправляю данные в концентратор событий в методе инициализации, и эта часть работает отлично. Затем я создаю новый метод тестирования для проверки приемной стороны. Код выглядит так:

[TestMethod]
public void TestProcessEventsAsync()
{
    //Initialize the receiver, and run it
    Receiver receiver = new Receiver();
    Receiver r = new Receiver(eventHubName, connectionString);
    r.MessageProcessingWithPartitionDistribution();

    //check if the data is stored in the database
    ...
}

Здесь я просто создаю новый экземпляр получателя и использую его для обработки данных, отправленных в концентратор событий. Я отправляю в концентратор событий только три объекта, и два из них используют один и тот же раздел. Тест не прошел, и выходные данные показывают, что не все разделы инициализированы, что означает, что приемник останавливается до того, как он завершит обработку всех данных.

Я предполагаю, что, поскольку метод MessageProcessingWithPartitionDistribution() разделил задачу на несколько потоков, модульный тест не работает таким образом. Итак, мой вопрос: как я могу протестировать этот MessageProcessingWithPartitionDistribution() метод с помощью модульного теста?

Любая помощь приветствуется!


person de li    schedule 12.08.2015    source источник
comment
Есть ли в вашем тесте какая-либо логика, которая ожидает, пока концентраторы событий получат три сообщения и сохранят их? В противном случае возможно, что EventProcessorHost будет уничтожен до того, как получит возможность обработать ваши сообщения ...   -  person Dominic Betts    schedule 12.08.2015
comment
Я использовал Thread.Sleep(30000) после того, как отправил сообщение в концентратор событий и до того, как получатель начал обрабатывать сообщение. Поэтому я думаю, что данные уже находятся в концентраторе событий, когда процессор хочет их обработать.   -  person de li    schedule 12.08.2015


Ответы (1)


Чтобы убедиться, что EventProcessor корректно завершил работу, прежде чем вы вернетесь в базу данных в своем тесте, вы должны вызвать:

r.UnregisterEventProcessor();

Это должно гарантировать, что все ожидающие сообщения обработаны и EventProcessor выполняет контролируемое завершение работы.

person Dominic Betts    schedule 13.08.2015