Я пытаюсь протестировать некоторый код потока данных TPL и столкнулся с тем, что выглядит как проблема ковариации с сопоставлением параметров NSubstitue. Он утверждает:
Expected to receive exactly 1 call matching:
Subscribe("987123", any ITargetBlock`1)
Actually received 1 matching call:
Subscribe("987123", ActionBlock<ChainLinkFakeData>)
Из сопоставителя:
childFakeSubscriptionSource
.Received(1)
.Subscribe(
Arg.Is<string>("987123"),
Arg.Any<ITargetBlock<ChainLinkFakeData>>());
Таким образом, камень преткновения, по-видимому, заключается в том, что он не ковариантно сопоставляет ITargetBlock с реализующим классом ActionBlock.
Есть ли способ сделать это без явного сопоставления с ActionBlock или это просто текущее ограничение NSubstitute?
редактировать: для удобства всех это подпись класса ActionBlock. Я думаю, этого достаточно, чтобы увидеть проблему ковариации без использования тонны интерфейсов и т. д.
public sealed class ActionBlock<TInput> : ITargetBlock<TInput>, IDataflowBlock
Суть проблемы в том, что благодаря ковариации ITargetBlock<T>
должно соответствовать ActionBlock<T>
. Сопоставители аргументов Arg.Any<ITargetBlock<ChainLinkFakeData>>()
в NSubstitute, кажется, не работают?
Легкий обходной путь — это Arg.Any<ActionBlock<ChainLinkFakeData>>()
, но для этого требуется знание предмета реализации тестов.
Что касается более простого примера, я не проверял это, но ожидаю, что будут аналогичные проблемы с IEnumerable<T>
, не совпадающим с List<T>
.