使用 jest+supertest 进行单元测试。
1.安装依赖
#--save-dev 写入到devDependencies对象,只用于开发和测试
npm install jest --save-dev
npm install supertest --save-dev
2.配置
package.json
"scripts": {
"test": "cross-env NODE_ENV=test jest --runInBand --forceExit --colors",
}
cross-env是跨平台设置环境变量,与单元测试没什么关系
–runInBand: 顺序执行测试用例,默认是并行执行
–forceExit: 执行完所有测试用例后强制退出,释放资源
–colors: 高亮输出测试结果
3.测试文件
新建src/test文件夹,所有测试文件以.test.js结尾
3.1数据模型测试
db/model/User.js
/**
* @description 用户数据模型
*/
const seq = require('../seq')
// users
const User = seq.define('user', {
userName: {
type: Sequlize.STRING,
allowNull: false, //是否允许为空
unique: true, //是否是唯一索引
comment: '用户名,唯一'
},
password: {
type: Sequlize.STRING,
allowNull: false,
comment: '密码'
},
}, {
timestamps: true, //默认为true,自动生成`createdAt`和`updatedAt`字段
freezeTableName: false //默认为false,表名自动是使用复数形式,如user->users
})
module.exports = User
test/model.test.js
/**
* 用户数据模型test
*/
const User = require('../src/db/model/User')
test('test user model attribute', () => {
//build会在内存模型中构建一个User对象,但不会提交到数据库中
const user = User.build({
userName: 'zhangsan',
password: '123456',
})
// 验证各个属性
expect(user.userName).toBe('zhangsan')
expect(user.password).toBe('123456')
})
3.2 http请求测试
在test文件夹下新建server.js文件,模拟http请求服务器
server.js
const request = require('supertest')
const server = require('../src/app').callback()
module.exports = request(server)
以测试login和logout接口为例
routes/user.js
router.post('/login', async (ctx, next) => {
const {
userName,
password
} = ctx.request.body
ctx.body = await login(ctx, userName, password)
})
router.post('/logout', loginCheck, async (ctx, next) => {//loginCheck是我们自定义的中间件,检验当前用户是否登录,只有登录了才能退出
ctx.body = await logout(ctx);
})
test/user.test.js
//存储 cookie
let COOKIE = ''
//登录
test('login接口test', async () => {
const res = await server.post('/api/user/login').send({
userName,
password
})
expect(res.body.errCode).toBe(0)
//获取COOKIE,调用logout API
COOKIE = res.headers['set-cookie'].join(';')
})
// 退出
test('logout接口test', async () => {
const res = await server
.post('/api/user/logout')
.set('cookie', COOKIE) //登录后才能调用的接口需要设置cookie
expect(res.body.errCode).toBe(0)
})
4.执行测试
通过下面命令执行所有测试用例
npm run test