2

いくつかの 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>. NSubstituteの arg マッチャーArg.Any<ITargetBlock<ChainLinkFakeData>>()はそうではないようですか?

簡単な回避策ですArg.Any<ActionBlock<ChainLinkFakeData>>()が、それにはテストの実装に関する知識が必要です。

IEnumerable<T>より単純な例に関しては、これをテストしていませんが、一致しないと同様の確率があると予想していList<T>ます。

4

1 に答える 1

2

これは NSubstitute のバグであり、v1.4.0 で修正される必要があります。(原文参照)

于 2012-05-04T13:34:19.830 に答える