NSubstitute为对象返回Null

时间:2016-11-16 07:36:20

标签: c# unit-testing nsubstitute

我是单元测试的新手,对我来说听起来很容易让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,params   FUNC [])'

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

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

然后我在该行上收到执行错误:

  

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

3 个答案:

答案 0 :(得分:2)

如今,NSubsitute拥有调用ReturnsNull或表达式.Returns(l => null)的方法 https://github.com/nsubstitute/NSubstitute/pull/181

我认为这个话题应该由主持人结束

答案 1 :(得分:0)

我发现问题是我使用的是实际的“广告系列”而不是界面,所以NSubstitute正在使用实际的类:(

NSubstitute设计用于接口。

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

答案 2 :(得分:0)

我遇到了类似问题,并且在解决方案下方找到了

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

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