我正在尝试测试一些 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的类签名。我认为这足以看到协方差问题,而无需引入大量接口(interface)等。
public sealed class ActionBlock<TInput> : ITargetBlock<TInput>, IDataflowBlock
问题的核心是通过协方差,ITargetBlock<T>
应该匹配ActionBlock<T>
。 arg 匹配器 Arg.Any<ITargetBlock<ChainLinkFakeData>>()
在 NSubstitute 中似乎没有?
简单的解决方法是 Arg.Any<ActionBlock<ChainLinkFakeData>>()
但这需要了解测试实现中的主题。
就更简单的例子而言,我还没有对此进行测试,但我预计IEnumerable<T>
会有类似的问题。不匹配List<T>
.
最佳答案
这是 NSubstitute 中的一个错误,应该从 v1.4.0 开始修复。 (参见original issue)
关于c# - N 替代和协方差支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410713/