NSubstitute返回空对象的方法

12

我刚接触单元测试,听起来好像很容易让NSubstitute返回一个空值,但我无法做到。

我已经尝试了一个应该返回Campaign方法的Get方法。

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

在生产环境中,我使用FirstOrDefault()方法返回广告系列对象,如果不存在,则返回null。因此,在我的单元测试中,我希望测试这种情况,但我无法使用NSubstitute假装它,因为编译时出现以下错误:

error CS0121: The call is ambiguous between the following methods or properties: 'SubstituteExtensions.Returns(T, T, params T[])' and 'SubstituteExtensions.Returns(T, Func, params Func[])'

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

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

但是我在那一行遇到了执行错误:

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


该错误通常表示代码尝试使用空对象进行操作,而不是已实例化的对象。要解决此问题,您需要检查代码并确保所有对象都已正确初始化。

1
第二个例子应该可以工作,你能展示一下获取“NullReferenceException”的完整行吗?显然你在某种程度上使用了返回值。 - Fabio
3个回答

22

9
可能需要补充一下:我们需要使用 using NSubstitute.ReturnsExtensions; 才能使用 .ReturnsNull - David Tchepak

5

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

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

此外,您可以使用.Returns(i => null)或.ReturnsNull()来返回_campaigns.Get()方法的空值。

2
添加 using NSubstitute.ReturnsExtensions; 以使用 ReturnsNull() - M.Hassan
我发现如果属性类型为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<T>(T)' - void.pointer

1
我发现问题出在我使用了一个实际的类"Campaigns"而不是接口,所以NSubstitute正在使用实际的类 :(
NSubstitute的设计是用于与接口一起使用的。
因此,在这种情况下,我只需为我的类创建一个虚假对象,而不是使用NSubstitute。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接