Я пытаюсь протестировать некоторый код потока данных TPL и работать с тем, что похоже на проблему ковариации с совпадением параметров NSubstitue. Он утверждает:Поддержка NSubstitute и ковариации?
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>
.
Можете ли вы показать пример интерфейса, есть ли у вас простой тест, показывающий поведение? – Bronumski
Хорошо добавит его выше. – DanH
@Danh - Мне кажется, что это проблема с потоками. Он ожидал 1 вызов и получил 1 соответствующий вызов - это должно означать, что ожидание соответствует правильно. В основной ветке есть [невыпущенное исправление] (https://github.com/nsubstitute/NSubstitute/blob/master/CHANGELOG.txt#L6). –