NSubstitute 为对象返回 Null

问题描述 投票:0回答:3

我是单元测试的新手,在我看来,让 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:对象引用未设置为 对象的实例。

c# unit-testing nsubstitute
3个回答
23
投票

现在 NSubsitute 有调用方法

ReturnsNull
或表达式
.Returns(l => null)
https://github.com/nsubstitute/NSubstitute/pull/181


5
投票

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

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

此外,您还可以使用

.Returns(i => null) or .ReturnsNull()
_campaigns.Get()
方法返回 null 值


1
投票

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

NSubstitute 旨在与界面配合使用。

因此,在本例中我没有使用 NSubstitute,而是为我的类创建了一个假对象。

© www.soinside.com 2019 - 2024. All rights reserved.