首页 > 解决方案 > 在 NSubstitute 中构造带有抛出异常的 void 方法的调用序列

问题描述

我有一个正在模拟的界面

public interface IFoo {
    void Bar(IEnumerable<int>);
}

我的测试代码依次调用 Bar() 几次。我想定义我的单元测试,以便 Bar 在第二次(或第 N 次)被调用时抛出异常。有没有一种简洁的方法来做到这一点?我找到了一个非 void 方法的例子:http: //nsubstitute.github.io/help/multiple-returns/

标签: c#unit-testingmockingnsubstitute

解决方案


无效调用的回调

Returns()可用于为返回值的成员获取回调,但对于void成员,我们需要不同的技术,因为我们不能在void返回时调用方法。对于这些情况,我们可以使用When..Do语法。

用于更复杂回调的回调构建器

构建器Callback让我们可以创建更复杂的Do()场景。我们可以使用Callback.First(),Then()ThenThrow()ThenKeepDoing()构建回调链。我们还可以使用Always()andAlwaysThrow()来指定每次调用的回调。请注意,Always()即使其他回调将抛出异常,也会调用方法设置的回调。

因此,对于您的情况,您可以设置替代品,例如

var foo = Substitute.For<IFoo>();
foo
    .When(_ => _.Bar(Arg.Any<IEnumerable<int>>()))
    .Do(Callback
        .First(_ => _)//First time do nothing
        .ThenThrow(new Exception()) //second time throw the provided exception
    );

参考回调、无效调用和When..Do


推荐阅读