私はいくつかのTPLデータフローコードをテストして、NSubstitue param matchingで共分散問題のように見えます。アサートされます。代用と共分散のサポート?
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>>());
のでつまずきは、それが実装しているクラスのActionBlockにITargetBlockのマッチング共変されていないことのように見えます。
明示的にActionBlockに一致させることなくこれを行う方法はありますか、それともNSubstituteの現在の制限ですか?
編集:Everyonesの便宜のために、これはActionBlockのクラス署名です。私は、問題のナブは、共分散を通じて、ITargetBlock<T>
はActionBlock<T>
と一致しなければならないことである
public sealed class ActionBlock<TInput> : ITargetBlock<TInput>, IDataflowBlock
これは、などのインターフェースのトンで引かず、共分散の問題を見るには十分だと思います。 NS substituteのarg matchers Arg.Any<ITargetBlock<ChainLinkFakeData>>()
はそうではありませんか?
簡単な回避策はArg.Any<ActionBlock<ChainLinkFakeData>>()
ですが、これはテストの実装対象の知識を必要とします。
私はこれをテストしていませんが、IEnumerable<T>
と一致しない類似のprobがあると思います(List<T>
)。
インターフェイスの例を表示できますか?その動作を示す簡単なテストはありますか? – Bronumski
Okが上に追加されます。 – DanH
@ダン - これはスレッドの問題のようです。 1件の通話があり、1件の一致する通話が受信されました。マスターブランチには未リリースの修正があります(https://github.com/nsubstitute/NSubstitute/blob/master/CHANGELOG.txt#L6)。 –