我要问的可能有点混乱,但我会尽量清楚。
基本上我正在使用mocha / chai对我的Node.JS服务器的数据访问层进行单元测试。我正在使用bluebird返回一个promise和一个SQLite数据库。
这是我要测试的功能插页:
insert(sqlRequest, sqlParams, sqlRequest2) {
return new Promise(function (resolve, reject) {
let insertStatement = this.getDatabase().prepare(sqlRequest);
let getStatement = this.getDatabase().prepare(sqlRequest2);
insertStatement.run(sqlParams, err => {
console.log('this.changes = ', this.changes);
if (this.changes === 1) {
getStatement.all({ $id: this.lastID }, (err, rows) => {
if (err) {
console.log('entered second err');
reject(err);
} else {
resolve(rows[0]);
}
});
} else {
console.log('entered first err ');
reject(err);
}
});
}.bind(this));
}
这是我对mocha的测试:
it('insert : Error 2st SQL query', function (done) {
const daoCommon = new DaoCommon();
daoCommon.getDatabase = () => {
return {
prepare: (sqlRequest) => {
return {
all: (sql, callback) => {
let err = {};
let rows = null;
callback(err, rows);
},
run: (sqlParams, callback) => {
let err = undefined;
callback(err);
}
}
}
}
}
daoCommon.insert('', '', '')
.then(success => {
expect.fail();
})
.catch(error => {
expect(error).to.eql({});
})
.finally(function () {
done();
})
});
我想模拟this.changes
等于1的测试,但我不知道如何设置此值。根据我所读到的,this object
来自回调函数,但我完全不知道它来自何处或如何为我的测试设置它。
答案 0 :(得分:1)
<强>更新强>
您可以使用方法的this
设置要调用的函数的.call
。
在您的情况下,使用callback
值调用this.changes
将如下所示:
var thisObject = {
changes: 1
};
callback.call(thisObject, err);
这将设置回调函数的值this.changes
。
this
this
的值
如果执行成功,
lastID
对象将包含两个 名为changes
和callback
的属性,其中包含值 最后插入的行ID和受此查询影响的行数 分别
这意味着this.changes
函数将始终具有this.changes = something
。除非您手动设置S
,否则您无法更改它,我不明白为什么会这样做。
答案 1 :(得分:0)
感谢@Maxali评论,我将在下面发布答案:
您可以在使用.call()调用函数回调(err)时设置此项。例如:callback.call({changes:1},err)。这会将更改设置为1
请注意,我必须更改此行insertStatement.run(sqlParams, err => {
,其中我将箭头函数的回调转换为函数声明insertStatement.run(sqlParams, function(err) {
,以使其正常工作。我假设这是由于箭头函数中没有引用函数本身内部的对象。