我是单元测试的新手,在我看来,让 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:对象引用未设置为 对象的实例。
现在 NSubsitute 有调用方法
ReturnsNull
或表达式 .Returns(l => null)
https://github.com/nsubstitute/NSubstitute/pull/181
我遇到了类似的问题并找到了以下解决方案
_campaigns = Substitute.For<IOptions<Campaigns>>();
_campaigns.Get(Arg.Any<string>()).ReturnsForAnyArgs(i => null);
此外,您还可以使用
.Returns(i => null) or .ReturnsNull()
为 _campaigns.Get()
方法返回 null 值
我发现问题是我使用的是实际的类“Campaigns”而不是接口,所以 NSubstitute 使用的是实际的类:(
NSubstitute 旨在与界面配合使用。
因此,在本例中我没有使用 NSubstitute,而是为我的类创建了一个假对象。