使用 JEST 对 Node.js 进行单元测试
jest
是 facebook
开发的 JavaScript
测试框架。
官方文档:https://jestjs.io/docs/getting-started
建立测试用例
在 test
目录下建立一个 被测试单元名.test.js
的文件,如:
跟它们放在一块。
假设你建立了一个 hello.test.js
文件,那么在里边可以使用 test
函数建立一个测试用例
test('two plus two is four', async () => {
expect(2 + 2).toBe(4);
});
test
的第一个参数是测试用例名,第二个参数是回调函数。
- 如果回调函数要求一个参数
done
,在测试结束后需要调用这个函数done
- 否则,需要返回一个
Promise
。
建议不传参数,使用 async
回调函数。
在测试用例的回调函数中可以使用各种 Matcher
,对返回值、异常等进行检查。具体可以参照官方文档 https://jestjs.io/docs/using-matchers 和已有代码。
执行测试
全局测试
npm run test
执行结果如下,PASS
就是通过了。
在本项目中,一定要执行通过之后再 commit
。
单个用例测试
使用 WebStorm
时,可以通过点击测试用例左侧的绿色三角形开始。
使用 jest --coverage
可以生成测试覆盖率报告;在 WebStorm
中也可以通过 Run with Coverage
进行覆盖率的测试。
测试用例的编写
由于我们是写 的业务代码里主要是数据库操作,所以在每个测试用例开始前需要进行数据库的连接操作;测试结束后需要关闭连接,否则会因为 CRUD
的码农Open handle
等问题无法结束测试。
注意所有 import
要写在 test
的前边。
使用 Mongoose
时,只需要调用 connect
和 disconnect
两个函数即可。
import {connect, disconnect} from "mongoose";
import config from '../src/config'
beforeEach(async () => {
await connect(config.mongolink)
})
afterEach(async () => {
await disconnect()
})
然后就可以写具体测试用例了。
test("用户改名", async () => {
// 新建一个用户
const phoneNumber = '12355556666'
const token = await signUser(phoneNumber)
const newName = "Brand New Name"
// 改一下名
const payload = new userChangeNameRequest({
token,
newName
})
await payload.checkParamValidity()
await userChangeNameExecutor(payload)
// 再查出来
const result = await userModel.findOne({phoneNumber: phoneNumber})
expect(result.phoneNumber).toBe(phoneNumber)
expect(result.userName).toBe(newName)
})