我正在尝试测试一些 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>
not matching List<T>
。