首页 > 解决方案 > 什么定义了“隔离”测试?

问题描述

我有一个名为的类Customer,我希望对这个类及其公共接口进行单元测试。为了能够进行单元测试,我必须Customer独立于它的真正依赖项进行测试。除此之外Customer,我有一个Monster我创建的课程。

我的应用程序正在使用一个游戏框架,该框架定义了一个Shape(代表一个形状)和Vec2F一个(代表一个用于数学的向量)。Customer依赖(使用)ShapeVec2F。它还使用一个Monster.

现在我必须模拟这些真正的依赖项,以便我的测试成为单元测试而不是集成测试。但是,什么定义了“真正的”依赖关系?就像我会理解为什么我会模拟我自己的实现,Monster但是从我使用的框架来看Vec2FShape我使用的似乎是这样的基本结构。

标签: c#unit-testing

解决方案


测试应与其他测试隔离。为此,您需要模拟被测系统消耗的任何全局状态。

如果被测系统不使用全局/共享状态 - 什么都不做。
在完美世界中,设置新数据库需要几毫秒,您可以为每个测试创建新数据库(EF Core 中的内存数据库)。

但是在我们的现实世界中,我们有代表全局状态的依赖项,如果不是,仍然会使测试变慢(Web 服务、文件系统、任何外部资源)。

您想模拟的那些依赖项以提供更快的反馈(单元测试)。

您可以拥有非常复杂的依赖层次结构,不使用全局状态或外部资源,但是使用这些依赖关系配置测试用例将变得非常复杂和困难。
在这种情况下,您将围绕非常非常复杂的依赖项引入一个抽象,并将在消费者的测试中模拟它。

在您的特定测试用例中,我不会模拟任何内容,除非框架类依赖于绘图屏幕逻辑(依赖于环境 API)。


推荐阅读