【发布时间】:2019-04-16 15:43:36
【问题描述】:
我正在使用 NSubsitute 来模拟我的测试方法使用的类。我想确保我的方法不会抛出由其依赖项引起的异常。
有没有办法强制模拟抛出异常,不管它的哪个方法被调用?
我知道,如果要调用特定方法,我可以“准备”模拟以引发异常。但是接下来我还需要检查是否调用了这个准备好的方法,以防止其他人在不更改单元测试的情况下更改代码。但这也意味着开始测试我不想做的算法。
编辑:因为我试图从 RestSharp 模拟 IRestClient,所以我至少找到了一种方法来为每次调用抛出异常将返回一个 Task
var restClient = Substitute.For<IRestClient>();
restClient.ReturnsForAll<Task<IRestResponse>>(t => throw new Exception("something did go wrong with the web api call"));
【问题讨论】:
-
“有没有办法强制模拟抛出异常,无论调用哪个方法?” - the docs on exceptions 说 “回调可用于在调用成员时抛出异常。所以听起来不像。
-
NSubstitute 不支持此功能。为此手动创建测试替身可能更容易。如果你使用 VS,它可以generate a sub-type that defaults to all members throwing
NotImplementedException. -
将
null作为服务传递而不是模拟它不是一个选项吗?这样任何方法调用都会抛出异常。 -
这肯定是一个不错的 hack ;-)
-
@DavidTchepak 你应该写下你的评论作为答案,这样我就可以接受并关闭它
标签: c# unit-testing nsubstitute