Node.js重新布线:对使用db util的路由进行单元测试不会影响db模拟功能

时间:2019-05-18 03:00:27

标签: node.js

通常,当使用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,仍然在查询真实的数据库,请问我应该如何纠正呢?

0 个答案:

没有答案