いくつかの 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>
ます。