接下来,让我们写第一个测试。在同一个文件夹中创建一个 math.test.js 文件,在这里我们将使用 Jest 来测试 math.js 中定义的函数:
const{sum}=require('./math')describe('Math module',()=>{it('should return sum result when one number plus another number',()=>{ // Givenconstnumber=1constanotherNumber=2 // Whenconstresult=sum(number,anotherNumber) // Thenexpect(result).toBe(2)})})
然后运行 yarn test (添加 NPM Script)你就可以看到相应的结果。
Given/When/Then 的套路
麻雀虽小五脏俱全,在上面的例子当中,我们可以看到很多的测试元素,下面将会一一介绍:
首先我们看到的是一个由 it 包裹的测试主体最小单元,采用了 Given When Then 的经典格式,我们常常称之为测试三部曲,也可以解释为 3A 即:
如同人类世界中的羁绊,软件模块之间必然也免不了依赖。Martin Fowler 在 UnitTest 这篇文章当中将单元测试作了一个重要的区分,即你所测试的单位应该是社交型(Social Tests)还是独立型(Solitary Tests)? 想象一下你正在测试一个 Order Class 的 price() 方法,而 price() 方法需要在 Product 和 Customer Class 中调用一些函数。如果你希望单元测试所测试的 Order 模块是独立的,那么你就不想直接使用真正的 Product 或 Customer Class,因为 Customer Class 的错误会直接导致 Order Class 的单元测试失败。相反,你可能会使用一个替身作为依赖的对象,也就是我们接下来会提到的 Fake/Stub/Mock/Spy。
现实世界里,我们在写代码和单元测试时,常常遇到的一些需要替身的对象包括:
Database 数据库
Network requests 网络请求
access to Files 存取文件
any External system 任何外部系统
其实在 Jest 当中,Fake/Stub/Mock/Spy 这些概念或许会有所混淆,而这跟 JavaScript 语言本身的特点有一定关系,但是我觉得 Jest 通过统一的 fn() 方法把问题解决得还比较恰当,让我们来一块儿看看实例 🌰: