moq.verify - универсальный метод, проверенный с базовым типом, когда используется унаследованный тип - PullRequest
0 голосов
/ 11 февраля 2019

Как проверить, что был сделан вызов универсальному методу с использованием унаследованного типа, когда я могу проверять только базовый тип.

У меня есть интерфейс с универсальным методом:

public interface IEvent
{
   void Subscribe<T>() where T : BaseEvent;
}

В моем коде есть несколько производных событий, которые наследуются от BaseEvent.Вот один из них:

public class  DerivedEvent: BaseEvent{}

Я вызываю метод подписки следующим образом:

myEvent.Subscribe<DerivedEvent>()

В модульном тесте я хочу убедиться, что вызов сделан с любым классом, производным от базового события.Это пройдет, но он использует производный класс.

v.Subscribe<DerivedEvent>(), Times.Exactly(1));

Это вызывается ноль раз:

v.Subscribe<BaseEvent>(), Times.Exactly(1));

Как я могу убедиться, что универсальный метод Subscribe был вызван с любым BaseEvent?

1 Ответ

0 голосов
/ 16 февраля 2019

Как проверить, что универсальный метод Subscribe был вызван с любым BaseEvent?

Поскольку Moq совпадает с универсальными аргументами не точно, а по совместимости присваивания (см. здесь и здесь , если вы заинтересованы в реализации), следующее должно просто работать:

public class BaseEvent { }
public class DerivedEvent1 : BaseEvent { }
public class DerivedEvent2 : BaseEvent { }

public interface IEvent
{
    void Subscribe<T>() where T : BaseEvent;
}


var eventMock = new Mock<IEvent>();

eventMock.Object.Subscribe<DerivedEvent1>();
eventMock.Object.Subscribe<DerivedEvent2>();

eventMock.Verify(m => m.Subscribe<BaseEvent>(), Times.Exactly(2));

Обратите внимание, как Verify выражается в терминах BaseEvent, но фактические вызовы относятся к двум различным производным типам.

Это пройдет, но используется производный класс.

v.Subscribe<DerivedEvent>(), Times.Exactly(1));

Это будет вызвано ноль раз:

v.Subscribe<BaseEvent>(), Times.Exactly(1));

Вам нужно будет показать больше вашего действительного кода теста для дальнейшей диагностики, почему в вашем конкретном случае не удалось подтвердить на основе BaseEvent.

...