【问题标题】:NSubstitute to return a Null for an objectNSubstitute 为对象返回 Null
【发布时间】:2016-11-16 07:36:19
【问题描述】:

我是单元测试的新手,在我看来,让 NSubstitute 能够为方法返回 null 应该很容易,但我无法让它工作。

我已经为应该返回 Campaign 方法的 Get 方法尝试了此方法

_campaigns = Substitute.For<IOptions<Campaigns>>();
_campaigns.Get(Arg.Any<string>()).Returns(null); 

在生产中,我使用 FirstOrDefault() 方法返回活动对象,如果不存在则返回 null。所以在我的单元测试中,我想测试这种情况,但我不能用 NSubstitute 伪造它,因为编译时出现以下错误:

错误 CS0121:以下方法之间的调用不明确或 属性:'SubstituteExtensions.Returns(T, T, params T[])' 和 'SubstituteExtensions.Returns(T, Func, 参数 函数[])'

我这样做是为了避免错误:

_campaigns.Get(Arg.Any<string>()).Returns((Campaign)null);

但随后我在该行收到执行错误:

System.NullReferenceException : 对象引用未设置为 对象的实例。

【问题讨论】:

  • 我认为第二个示例必须有效。你能在你得到NullReferenceException的地方显示完整的行吗 - 你显然以某种方式使用了返回值

标签: c# unit-testing nsubstitute


【解决方案1】:

现在 NSubsitute 有它调用 ReturnsNull 或表达式 .Returns(l =&gt; null) 的方法 https://github.com/nsubstitute/NSubstitute/pull/181

我觉得这个话题应该由版主关闭

【讨论】:

  • 也许我们需要using NSubstitute.ReturnsExtensions;来使用.ReturnsNull
【解决方案2】:

我遇到了类似的问题,找到了以下解决方案

_campaigns = Substitute.For<IOptions<Campaigns>>();
_campaigns.Get(Arg.Any<string>()).ReturnsForAnyArgs(i => null); 

另外,您可以使用.Returns(i =&gt; null) or .ReturnsNull()_campaigns.Get() 方法返回空值

【讨论】:

  • 使用using NSubstitute.ReturnsExtensions;添加使用ReturnsNull()
  • 我发现如果属性类型为bool?ReturnsNull() 不起作用。我得到:The type 'bool?' must be a reference type in order to use it as parameter 'T' in the generic type or method 'ReturnsExtensions.ReturnsNull&lt;T&gt;(T)'
【解决方案3】:

我发现问题是我使用的是实际的“Campaigns”类而不是接口,所以 NSubstitute 使用的是实际的类 :(

NSubstitute 旨在与接口一起使用。

因此,在这种情况下,我没有使用 NSubstitute,而是为我的班级创建了一个假对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2021-09-10
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多