Создание метода с производными аргументами - PullRequest
2 голосов
/ 05 марта 2012

Я не могу понять, как правильно издеваться над этим методом. Метод, который я хочу издеваться ниже:

public virtual void Publish<TEvent>(TEvent evt) where TEvent : IDomainEvent {
    HandlerInvoker.Invoke(evt);
}

Пример TEvent, над которым я хочу поиграть:

public interface IOrderPlaced : IDomainEvent {}

Я могу издеваться над этим, если использую:

mock.Setup(h => h.Publish(It.IsAny<IOrderPlaced>));

Однако я хочу смоделировать метод для всех интерфейсов, производных от IDomainEvent, следующим образом:

mock.Setup(h => h.Publish(It.IsAny<IDomainEvent>));

но это совсем не работает. Это работает только тогда, когда я настраиваю макет с использованием определенного интерфейса. Но это совершенно нереально в моем приложении, так как у меня более 100 интерфейсов, происходящих от IDomainEvent. Не говоря уже о том, что поддерживать зверя было бы, если бы мне приходилось издеваться над каждым из них в отдельности. Кто-нибудь видит что-то, что я делаю не так?

1 Ответ

1 голос
/ 06 марта 2012

Проблема, с которой вы сталкиваетесь, состоит в том, что каждый другой производный 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 (). Возможно, если вы подробнее расскажете о желаемом результате, мы сможем найти альтернативное решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...