首页 > 解决方案 > NSubstitute 是模拟库还是存根库?

问题描述

根据官方网站,NSubstitute 是 .NET 模拟库的友好替代品。我对此进行了搜索/阅读,并找到了参考的好文章,就是这样。这里有几行

对于存根

因为这段代码只知道抽象(即接口),所以很容易运行这段代码而不使用这些接口的生产实现。我可以只为实现这些接口的测试创建另一个实现,但不调用数据库。这些测试实现被称为“存根”。

& 用于模拟

模拟库允许您模拟接口或抽象类型的实现。您实例化接口的“模拟”对象,并告诉该模拟对象如果针对该模拟调用方法/属性应该返回什么。您还可以断言一个方法/属性被调用或未被调用。

因此,如果我们想更好地关联/理解它,例如在模拟/存根库方面,它是什么?它是一个 Mock / Stub / 两者都有简单的做事方式吗?

标签: nsubstitute

解决方案


我认为这方面的权威来源是 Gerard Meszaros 的xUnit 测试模式书。Martin Fowler 对Meszaros 的测试双打类型进行了很好的总结。从这些定义来看,存根是返回特定结果的测试替身,而模拟是针对应该在测试运行之前接收的调用设置的特定期望。

NSubstitute 专为 Arrange-Act-Assert (AAA) 测试而设计,据我所知,它最初是由精彩的Moq 库推广的。术语 mock 和 stub 早于 AAA,所以我认为它们不完全适合这些类型的库。术语随着时间的推移变得模糊,因此任何测试替身都倾向于被称为“模拟”,即使我们没有设定明确的期望。

如果我们对定义有点松懈,那么在 NSubstitute 上下文中,我们可以使用“存根”来引用我们使用 设置的响应Returns,并使用“模拟”来断言使用 接收到预期的调用Received。这可以在同一个测试双对象上完成。即我们不创建模拟或存根,我们创建一个可以同时做的测试替身(或“替代”)。NSubstitute 故意模糊了这些界限。从网站

模拟,存根,伪造,间谍,测试替身?严格还是宽松?不,只需替换您需要的类型!

NSubstitute 专为 Arrange-Act-Assert (AAA) 测试而设计,因此您只需要安排它应该如何工作,然后断言它在完成后收到了您期望的调用。因为您需要编写比需要模拟还是存根更重要的代码。

在回答您的问题时,如果我们严格定义,NSubstitute 是一个用于创建测试替身的库,并支持存根和模拟的替代品(AAA 而不是调用期望)。在实践中,每个人都倾向于对定义松散,只是将测试替身称为“模拟”。


推荐阅读