Поддержка NSubstitute и ковариации?

Я пытаюсь протестировать некоторый код потока данных 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>.


person DanH    schedule 02.05.2012    source источник
comment
Можете ли вы показать пример интерфейса, у вас есть простой тест, который показывает поведение?   -  person Bronumski    schedule 02.05.2012
comment
@Danh - для меня это похоже на проблему с потоками. Он ожидал 1 вызов и получил 1 соответствующий вызов — это должно означать, что ожидание совпало правильно. В основной ветке есть невыпущенное исправление.   -  person David Tchepak    schedule 02.05.2012
comment
@DT Вы уверены, что это не соответствует? Судя по сообщению об ошибке, это больше походило на проблему совпадения. Я подожду и посмотрю, есть ли шансы. FWIW, если я скажу, чтобы он соответствовал ActionBlock‹T›, он работает нормально, что, я думаю, тоже говорит против многопоточности?   -  person DanH    schedule 02.05.2012
comment
@DT - я вернулся к этому и понял, что мое исправление превращения его в ActionBlock‹T› не всегда работало, поэтому я вернулся к ITargetBlock‹T› с Sleep(1000) над ним, и теперь это проходит. Так что спасибо, что ответили. Если вы поместите свой ответ в правильный ответ, я могу начислить вам баллы, отметив правильный?   -  person DanH    schedule 02.05.2012


Ответы (1)


Это была ошибка в NSubstitute, которая должна быть исправлена ​​в версии 1.4.0. (см. исходную проблему)

person Community    schedule 04.05.2012