通常,当使用rewire进行单元测试时,我们可以重新连接模块,然后将子模块设置为模拟,即2层,例如userModule-> mysqlModule。
就我而言,我不知道如何测试执行db get查询的GET API,在线示例使用的是index.js。
文件结构为index.js-> user.js-> mysql.js
database / mysql.js
mysqlPool.execSqlCmd = async (sqlCmd) => {
let result = '';
try {
result = await mysqlPool.query(sqlCmd);
return result;
} catch (err) {
throw new Error(err);
}
};
module.exports = mysqlPool;
route / user.js
const mysql = require('../database/mysql.js')
router.get('/list', async (req, res) => {
logger.info('GET /user/list');
const sqlCmd = 'select * from persons';
try {
const ret = await mysql.execSqlCmd(sqlCmd);
res.json(ret);
} catch (err) {
logger.error(err);
res.status(500).send({ message: `${err}` });
}
});
module.exprts = router;
index.js
const usersRoute = require('./routes/user')
const app = express();
app.use('/user', usersRoute)
现在我想对user.js进行单元测试,我使用rewire进行了此操作,但不知道如何在不使用index.js的情况下进行操作。
const request = require('supertest');
const app = require('./index');
const mysql = rewire('./database/mysql.js');
const userModule = rewire('./route/user.js');
const mysqlMock = {
execSqlCmd: () => ({ id: 2, lastName: 'Test Name', firstName: 'Test Name' }),
};
userModule.__set__({ mysql: mysqlMock });
describe('GET User', () => {
it('get all users should success', () => {
return request(app).get('/usr/list').then((res) => {
console.log('GET /usr/list');
console.log(res.body);
chai.expect(res).to.have.status(200);
});
});
});
但是它没有命中mysqlMock,仍然在查询真实的数据库,请问我应该如何纠正呢?