在NSubstitute中构造对具有抛出异常的void方法的调用序列

时间:2018-08-11 00:19:07

标签: c# unit-testing mocking nsubstitute

我有一个要模拟的界面

capnp compile

我的被测试代码依次调用Bar()几次。我想定义我的单元测试,以便Bar在第二次(或第N次)调用时引发异常。有一种简洁的方法吗?我找到了非无效方法的示例:http://nsubstitute.github.io/help/multiple-returns/

1 个答案:

答案 0 :(得分:1)

  

无效呼叫的回调

     

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

     

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

     

Callback构建器使我们可以创建更复杂的Do()方案。我们可以使用Callback.First()后跟Then()ThenThrow()ThenKeepDoing()来构建回调链。我们还可以使用Always()AlwaysThrow()来指定每次调用的回调。请注意,即使其他回调会引发异常,也会调用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
    );

引用Callbacks, void calls and When..Do