c# - 在 NSubstitute 中构造带有抛出异常的 void 方法的调用序列
问题描述
我有一个正在模拟的界面
public interface IFoo {
void Bar(IEnumerable<int>);
}
我的测试代码依次调用 Bar() 几次。我想定义我的单元测试,以便 Bar 在第二次(或第 N 次)被调用时抛出异常。有没有一种简洁的方法来做到这一点?我找到了一个非 void 方法的例子:http: //nsubstitute.github.io/help/multiple-returns/
解决方案
无效调用的回调
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
);
推荐阅读
- objective-c - UISearchBar 上的正则表达式
- php - 如何设置将检查 30 天或超过 30 天的有效期的条件
- vba - 在excel中复制两列中的匹配行
- xamarin - 如何将带有文本的内容区域添加到 TableView 的底部?
- javascript - 使用参数调用操作
- reactjs - 使用 webpack 加载器在 React 中加载图像
- azure - Azure CosmosDB 帐户:重新生成的帐户密钥需要多长时间才能生效?
- java - 将字符串输入存储在文件中
- regex-negation - 正则表达式匹配不在特定特殊字符之间的
- html - 从 HTML 访问 JSON 数据 - Angular 4