gpt4 book ai didi

javascript - 在 Node.js 中使用 Jest 进行单元测试

转载 作者:行者123 更新时间:2023-12-01 15:26:43 25 4
gpt4 key购买 nike

我对单元测试很陌生,对此感到非常兴奋。但是我不确定是否应该在我的生产代码中添加防御性编程风格。因此,请查看以下代码。
calclateFinalYearGPA.js(生产代码)

const _ = require('lodash');
const getGPAPoint = require('./getGPAPoint');

module.exports = function (gradings) {
let totalPoint = 0;

gradings.forEach((grading) => {
const grade = grading.grading.grade.name;
const point = getGPAPoint(grade);
totalPoint += point;
});

const finalYearGPA = _.round(totalPoint / gradings.length, 1);

return finalYearGPA;
};
gradings是从数据库中提取的对象数组,具有以下结构。
"gradings": [
{
"grading": {
"gradeId": 3,
"grade": {
"gradeId": 3,
"name": "A-"
}
}
},
...
]
在我的 calculateFinalYearGPA.js , 我循环遍历该数组并提取 grading.grade.name这是 A-在上述结构中,并将其传递给 getGPAPoint .它将返回十进制数。
所以,现在在我的 calculateFinalYearGPA.test.js测试,我添加了以下代码,用于测试 gradings时是否失败不是数组。
const calculateFinalYearGPA = require('../../../utils/calculateFinalYearGPA');

describe('calculateFinalYearGPA', () => {
it('should throw an exception if input is not an array', () => {
const inputs = [1, 'a', null, undefined, {}];
inputs.forEach((i) => {
expect(() => {
calculateFinalYearGPA(i);
}).toThrow();
});
});
});

所以,现在我需要在我的生产代码中添加一些防御性编程代码。
if (gradings.constructor !== Array)
throw new Error(`Expected to get an array, got ${typeof gradings}.`);
我的做法对吗?我应该测试 gradings数组也有正确的结构吗?如果是这样,我需要添加一些与业务逻辑无关的代码,但请检查 gradings数组的结构。我的生产代码将填充这种代码。它应该是吗?
测试我的 calculateFinalYearGPA.js 的正确方法是什么? ?

最佳答案

实际上我不认为这是正确的,我的意思是期望它会抛出错误,逻辑上抛出错误意味着某些东西 意外发生了
所以测试输入结构的正确方法是在 calculateFinalYearGPA.js 之内文件,如下所示:

module.exports = function (gradings) {

if(!Array.isArray(gradings)) {
throw new Error(`Expected to get an array, got ${typeof gradings}.`);
}
let totalPoint = 0;
...
};
但是,如果您需要在 Jest 中处理错误或者您至少可以检查它,我只建议您创建一个自定义 Error类,因此您可以根据需要进行操作,因此:
class CustomError extends Error {
constructor(code, message) {
const fullMsg = message ? `${code}: ${message}` : code;
super(fullMsg);
this.name = code;
this.code = code;
this.message = fullMsg;
}

toString() {
return this.message;
}
}
注: excpect(SOME_THING).toThrow() in jest 会捕获任何错误,因此您必须确定哪些错误会导致测试失败,哪些不会。
所以现在我们有内部 calculateFinalYearGPA.js文件
module.exports = function (gradings) {

if(!Array.isArray(gradings)) {
throw new CustomError(799, `Expected to get an array, got ${typeof gradings}.`);
}
let totalPoint = 0;
...
};
最后进行测试
const calculateFinalYearGPA = require('../../../utils/calculateFinalYearGPA');

describe('calculateFinalYearGPA', () => {
it('should throw an exception if input is not an array', () => {
const inputs = [1, 'a', null, undefined, {}];
inputs.forEach((i) => {
try {
calculateFinalYearGPA(i);
} catch(e) {
expect(e.code).toBe(799); // 799 is an optional number which refers the type mis-matched
}
});
});
});

关于javascript - 在 Node.js 中使用 Jest 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63643941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com