c# - N 替代和协方差支持?

标签 c# task-parallel-library covariance nsubstitute

我正在尝试测试一些 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/

相关文章:

c# - 如何在 Debug模式下关闭 Visual Studio 中的 DocFX,同时在 Release模式下处于事件状态?

c# - 从多个线程向 DbSet 添加元素的方法

c# - 多线程中的入队和出队

scala - Scala中的协方差逆变错误

c# - 在正则表达式中查找两个模式

c# - 如何发送延续 token 来查询azure时间序列见解?

c# - 我怎样才能等到 Parallel.ForEach 完成

c# - 在控制台应用程序中同步运行的任务

c# - 使用通用接口(interface)约束时的协变/逆变难题

c# - 如何解决 IReadOnlyDictionary 缺乏协方差的问题?