当函数未明确返回任何内容时,我有一个关于在Node应用程序中编写Mocha单元测试的问题。
具体来说,我要编写用于迭代两个数组的测试的函数-一个用于插入,一个用于更新。该函数如下所示:
module.exports = async function dataSetsMergeOp(args) {
const recordsToInsert = args.newRecords;
const recordsToUpdate = args.matchingRecords;
// Handle inserts
if (recordsToInsert.length > 0) {
for (let record of recordsToInsert) {
try {
const insertQuery = `
INSERT INTO cd.customer_accounts (
hypindx,
hypnumbr_1,
hypnumbr_2,
) VALUES (?, ?, ?);
`;
const args = [
record.HYPINDX,
trimmedStringOrNull(record.HYPNUMBR_1),
trimmedStringOrNull(record.HYPNUMBR_2),
];
console.log('Record inserting...');
await queryHandler(insertQuery, args);
} catch (error) {
console.log(error);
}
}
}
// Handle updates
if (recordsToUpdate.length > 0) {
for (let record of recordsToUpdate) {
try {
const updateQuery = `
UPDATE cd.customer_accounts
SET
hypindx = ?,
hypnumbr_1 = ?,
hypnumbr_2 = ?
WHERE hypindx = ?
`;
const args = [
record.ACTINDX,
trimmedStringOrNull(record.HYPNUMBR_1),
trimmedStringOrNull(record.HYPNUMBR_2),
record.HYPINDX
];
console.log('Record updating...');
await queryHandler(updateQuery, args);
} catch (error) {
console.log(error);
}
}
}
};
现在我的摩卡咖啡测试的相关部分看起来像这样:
before(async function () {
try {
result = await dataSetsMergeOp(args);
} catch (e) {
console.log(e.stack);
}
});
it("should be truthy", function () {
assert.isOk(result);
});
it("should return an object for the 'job'", function () {
assert.isObject(result);
});
it("should return a number for the 'affectedRows' property", function () {
assert.typeOf(result.affectedRows, "number");
});
it("should return a number for the 'warningStatus' property", function () {
assert.typeOf(result.warningStatus, "number");
});
it("expect 'warningStatus' to be 0", function () {
expect(result.warningStatus).to.equal(0);
});
但是在我的例子中,因为我没有在测试的函数中显式返回任何内容,所以result
最终是undefined
,即使该函数成功运行也是如此。而且由于我的函数利用了for-of
循环,所以我不想在return await
函数中使用dataSetsMergeOp()
,因为尽管这会使测试通过,但在测试结束后它将停止循环。第一次迭代。
那么为这种功能编写测试的推荐方法是什么?
答案 0 :(得分:1)
要单元测试,我希望该功能不会抛出任何异常。
您可能想要返回类似{ updatedDocumentsCount: n }
的内容,并在每次循环迭代时将其递增,并断言它等于您传递的文档数。
对于集成测试,您想在函数执行之前和之后查询数据库,并检查您是否实际更新/插入了预期的文档数。