Проблема, с которой вы сталкиваетесь, состоит в том, что каждый другой производный IDomainEvent
, с которым вы вызываете Publish<T>()
, реализован как метод с другой сигнатурой.
Moq проверяет только одну подпись, когда вы используете Setup()
Фактически, mock.Setup(h => h.Publish(It.IsAny<IDomainEvent>));
будет только издеваться над Publish<IDomainEvent>(x)
, только когда компилятор определенно обработает x как тип IDomainEvent
. например,
OrderPlaced event = new OrderPlaced();
mock.Object.Publish((IDomainEvent)event);
К сожалению, нет способа настроить каждую сигнатуру фиктивного универсального метода. Вы даже не можете перебрать все производные от IDomainEvent типы во время выполнения с отражением - потому что вы столкнулись с точно такой же проблемой при попытке доступа к универсальному методу It.IsAny ().
Для получения дополнительной информации прочитайте этот связанный ответ на другой вопрос.
...
Если у вас ложное поведение, то методы все равно будут успешными. Поэтому я предполагаю, что вы хотите добавить дополнительное поведение, например .Returns () или .Callback ().
Возможно, если вы подробнее расскажете о желаемом результате, мы сможем найти альтернативное решение?