C# - 单元测试,模拟?

Posted

技术标签:

【中文标题】C# - 单元测试,模拟?【英文标题】:C# - Unit test, Mock? 【发布时间】:2011-04-11 18:35:59 【问题描述】:

应该使用目标类的内置单元测试生成器(VS)还是我应该自己学习如何编写单元测试?这个“模拟”是什么?我一遍又一遍地听到它,但没人愿意给出一个好的解释。

提前致谢。

【问题讨论】:

What is Mocking? 的可能重复项 【参考方案1】:

您需要学会自己编写单元测试。从正确理解许多人会犯错误的术语开始:

单元测试:测试单个代码单元,非常小的原子测试。

集成测试:测试集成在一起的多个代码单元,以通过不同的层并确保它们正确地相互使用。这些应该在单元测试验证各个单元独立工作之后完成。许多人错误地将这些称为单元测试。

构建验证测试:通过部署构建的产品并运行测试来测试构建的产品,这些测试将以用户的方式与之交互。也经常被错误地称为单元测试。这些是最大最全功能的测试,通常只是由测试团队手动完成,而不是自动化。

这是 MOQ 的快速入门,它是一个模拟框架: https://github.com/Moq/moq4/wiki/Quickstart

Mocking 是取一小段可能依赖于其他事物的代码的行为,模拟那些其他事物,以便您可以控制要测试的代码段周围的环境。

模拟的目的是测试中的原子性。它允许您只测试您想要的单个代码段,而不会因为相关代码段中的错误而影响它的测试。模拟还使您能够制造各种场景来测试每段代码的边缘情况。

Mocking 通常用于在单元测试中围绕目标代码创建边界,尽管在集成测试中也经常使用它来制造充当目标集成代码链的种子的资源。

【讨论】:

应该将这些“模拟”保存在自己的类中,还是只是临时测试一些代码,然后再删除模拟? @ebb:这是一种老派的做法,而且效果很好,但这就是模拟框架的用武之地,它们允许您模拟对象而无需实际创建要使用的模拟类。然而,所有的模拟都取决于与你假装的对象之间的多态关系。因此,您需要一个接口或基类来共享,或者需要虚拟方法来覆盖您假装的对象。 @ebb - 我建议首先学习基本的单元测试,以获取不依赖于外部系统(如 Web 服务和数据库)的代码。一旦你完成了其中的一些,你就可以学习如何通过模拟它们来对与外部系统交互的代码进行单元测试。 和 +1 @Jimmy,特别是用于区分单元测试和集成测试。太多的人在编写集成测试时确信它们是单元测试,并因此而被 TDD 推迟。单元测试不仅仅是一种测试代码的方式——它推动了模块化设计。 @AlexHumphrey 我还认为单元测试也是目前最强大的调试工具。我永远不会错过在***别的功能上遇到错误然后逐步执行数百行它调用的方法来寻找某些计算错误的日子。单元测试大多数时候你可以发现过程中出现问题的确切步骤。

以上是关于C# - 单元测试,模拟?的主要内容,如果未能解决你的问题,请参考以下文章

C# 项目中的单元测试和模拟 SubscriberClient (Google Pub/Sub)

在 Typescript 单元测试中模拟

使用 IoC 进行单元测试

.NET 单元测试的艺术&单元测试之道C#版

单元测试——使用模拟对象做交互测试

基于C#的单元测试(VS2015)