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>not matching List<T>

4

1 回答 1

2

这是 NSubstitute 中的一个错误,应该从 v1.4.0 开始修复。(见原始问题

于 2012-05-04T13:34:19.830 回答