【问题标题】:Force NSubstitute to throw exceptions for every call强制 NSubstitute 为每次调用抛出异常
【发布时间】: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


【解决方案1】:

NSubstitute 不支持此功能。

为此手动创建测试替身可能更容易。如果您使用的是 VS,它可以generate a sub-type that defaults to all members throwing NotImplementedException。 (R# 和 Rider 提供类似的选项。)

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 2016-12-15
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多