【问题标题】:NSubstitute cannot setup return value (CouldNotSetReturnException)NSubstitute 无法设置返回值 (CouldNotSetReturnException)
【发布时间】:2013-05-30 23:08:12
【问题描述】:

我有一个接口(称为IRepository),上面有这样的方法:

IEnumerable<TEntity> ExecuteStoredProcedure<TEntity>(string functionName, 
                                      params Tuple<string, object>[] parameters);

我正在尝试设置通过我的单元测试调用该方法时将返回的内容。像这样:

dataAccess = Substitute.For<IRepository>();
dataAccess.ExecuteStoredProcedure<MyCustomReturnType>(null, null)
          .ReturnsForAnyArgs(MyCustomReturnList);

当我运行测试时,我得到了这个异常:

NSubstitute.Exceptions.CouldNotSetReturnException:找不到返回的调用。

该消息继续警告尝试对实际类执行此操作,但这不适用于我。

我尝试将我的 null 参数更改为更真实的东西:

ExecuteStoredProcedure<MyCustomReturnType>("", new Tuple<string, object>[]{null})

但这并没有帮助......

任何想法我用这个替代品做错了什么?

(我的猜测是它与params 关键字有关。)

【问题讨论】:

  • 此示例适用于最新的 NSub 版本:gist.github.com/dtchepak/05179a90ad59623b21b3 您能否发布该测试与您的代码之间的任何差异?
  • 感谢工作代码。让我意识到在通话之前没有设置我的静态类(保存列表)。 (有关详细信息,请参阅我的答案。)

标签: c# .net unit-testing mocking nsubstitute


【解决方案1】:

所以,这就是 Stack Overflow 的简化可能会给您带来麻烦的地方。

列表MyCustomReturnList 实际上是一个静态类中的列表。由于将列表作为返回值传递并不会实际影响类,因此不会调用静态构造函数(它会设置列表)。

不知何故(不太确定细节),对尚未设置的列表的“引用”是 NSubstitute 无法设置返回值(可能是因为它没有初始化)。

NSubstitute 唯一可以做得更好的是一条不同的错误消息。但错误出现在我的代码中,而不是 NSubstitute。

【讨论】:

  • 您能帮我发送一个复制案例吗?然后我可以看看是否有办法检测它并改进错误消息。
  • @DavidTchepak - 我尝试了大约一个小时来让它在一个包含的场景中重现。我不知道我做了什么,但我不能让它在我的 WPF 应用程序之外发生......如果我有时间,我会尝试回到它以再次尝试重现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多