【发布时间】:2021-12-05 02:50:06
【问题描述】:
这是我的问题:
我需要在 Node.js 中为一个函数编写一个测试,该函数从数据库中选择数据。它通过使用回调函数返回值。(代码在下面。)
getCompanyById(id, callback) {
let company = null;
this.db.query("SELECT * FROM Company where id=?", id)
.on('result', function (data) {
company = data;
})
.on('end', function () {
callback(company);
});
}
我想在 Test 函数中做的是:
- 用所有 id(这里是 1 和 2)测试这个函数;
- 如果所有测试都通过,console.log("Test for getCompanyById() pass")。
这是我的测试代码的原始版本。
function testGetSchoolAdministrationById() {
var pass1,pass2;
databaseConnection.getSchoolAdministrationById(1, function (schoolAdministration) {
if(schoolAdministration.first_name == "Harald" &&
schoolAdministration.last_name == "Schmidt" &&
schoolAdministration.id_schoolAdmin == 1)
pass1=true;
}
);
databaseConnection.getSchoolAdministrationById(2, function (schoolAdministration) {
if(schoolAdministration.first_name == "Madeline" &&
schoolAdministration.last_name == "Müller" &&
schoolAdministration.id_schoolAdmin == 2)
pass2=true;
}
);
console.log("Test for getCompanyById() passed: " + (pass1 && pass2));
}
但它返回“未定义”。在网上搜索后,我意识到 Node.js 是 Asynchrony 的,它不会这样工作。 console.log("..") 已经完成,而回调还没有完成。我也看到了答案,比如使用另一个回调函数来处理值。但就我而言,我有 2 个回调,但不知道该怎么做。
所以这是我的问题:
-
有没有什么方法可以在不改变
getCompanyById(id, callback)函数的情况下实现函数testGetSchoolAdministrationById()的目标?(因为这对其他代码有相当大的影响。) -
如果1.问题是不可能的,有什么办法可以达到目的,而函数
getCompanyById(id, callback)可以改吗?换句话说,有没有更好的方法可以在不使用回调的情况下实现getCompanyById(id, callback)的相同目标? -
或者也许测试框架会对此有所帮助?我没有使用任何测试框架,因为我没有尝试过,而且我对那些不是很熟悉。
这是我第一个关于 Node.js 的项目,所以我对上面提到的任何概念都不是很有信心。因此,欢迎任何建议和答案。由于这也是我关于堆栈溢出的第一个问题,因此也欢迎任何关于问题/标题/结构的建议。希望,我清楚地描述了这一点。我真的很想弄清楚这一点。
【问题讨论】:
-
嵌套回调,以便在第一个查询完成时执行第二个查询。
-
...一旦你了解了它是如何与回调一起工作的,请了解 Promise 并改用它们。
标签: javascript node.js testing callback