Я пытаюсь создать слой абстракции для своей очереди, чтобы улучшить интеграционные тесты.Реальная очередь - это RabbitMq через EasyNetQ.
В моей программе я подписываюсь на события, с помощью которых я связываю методы с определенными типами событий - когда событие публикуется, я хочу, чтобы метод выполнялся.Это, конечно, хорошо работает при использовании реальной вещи.
Однако это делает мои тесты зависимыми от сервера RabbitMq, и это заставляет код выполнять асинхронно, что, во-первых, затрудняет определение того, когда тест следует считать завершенным.
Я быне используйте этот вопрос для обсуждения решения абстрагировать RabbitMq в моих тестах.
Чтобы создать заглушку для использования в моих тестах, мне нужно сохранить ссылку на обработчики событий - и мне нужновыполнять обработчики событий, когда впоследствии публикуются события соответствующих типов.
Поэтому я думаю, что мне нужен код, подобный тому, что я написал ниже.Я могу хранить обработчики событий как делегаты, но как их вызвать?Обработчики событий RabbitMq находятся в форме Func, где T - тип события, которое обрабатывает обработчик.
Func<int, Task> handle1 = ...;
Func<string, Task> handle2 = ...;
List<> l = new List<>();
l.Add( handle1);
l.Add( handle2);
foreach(Func f in l)
{
if (f-parameter is string)
{
f("");
}
if (f-parameter is int)
{
f(1);
}
}