【发布时间】:2020-06-01 00:51:35
【问题描述】:
我有一个小的包装类,它为一些 mysql 功能添加了 Promise。
const mysql = require('mysql');
export default class MySQL {
constructor(host, user, password, database, port = 3306) {
this.conn = mysql.createConnection({
host,
port,
user,
password,
database,
});
}
query(sql, args) {
return new Promise((resolve, reject) => {
// eslint-disable-next-line consistent-return
this.conn.query(sql, args, (err, rows) => {
if (err) {
reject(err);
return;
}
resolve(rows);
});
});
}
close() {
return new Promise((resolve, reject) => {
this.conn.end((err) => {
if (err) {
reject(err);
return;
}
resolve();
});
});
}
}
我正在尝试为这个类编写一个单元测试,但我完全陷入了试图模拟 this.conn 的困境。
我尝试了 proxyquire、sinon 和两者结合的各种组合。当我在 beforeEach 钩子中使用 proxyquire 时:
beforeEach(function () {
createConnectionStub = sinon.stub();
MySQL = proxyquire('../../lib/utils/mysql', {
mysql: {
createConnection: createConnectionStub,
},
}).default;
});
并尝试为 conn 对象设置存根:
it('Returns query results', async function () {
stubDb = new MySQL('host', 'user', 'password', 'database');
stubDb.conn = sinon.stub();
const results = await stubDb.query('SELECT * FROM whatever');
});
我不断收到TypeError: this.conn.query is not a function
将模拟设置为 this.conn 属性以便我可以轻松地断言方法调用的最佳方法是什么?任何帮助将不胜感激
【问题讨论】:
标签: node.js unit-testing mocha.js sinon