javascript - 如何使用 jest nodejs 测试 catch 块?
问题描述
我如何在 es6 类上测试 catch 块
const fs = require('fs');
class Service {
constructor(accessToken) {
this.accessToken = accessToken;
}
async getData() { // eslint-disable-line class-methods-use-this
try {
const data = fs.readFileSync(`${__dirname}/models/mockData.json`, { encoding: 'utf8' });
const returnData = JSON.parse(data);
return returnData;
} catch (err) {
return err;
}
}
}
module.exports = Service;
开玩笑,我如何编写测试用例来覆盖 catch 块。
解决方案
您可以模拟方法readFileSync
fromfs
以强制它返回undefined
。JSON.parse(undefined)
将引发错误,因此您可以检查代码的捕获端。
fs.readFileSync = jest.fn()
fs.readFileSync.mockReturnValue(undefined);
首先,在catch
侧面你应该抛出错误。从我的角度来看,在管理错误时仅仅返回它并不是一个好习惯。但是有人在做。
const fs = require('fs');
class Service {
constructor(accessToken) {
this.accessToken = accessToken;
}
async getData() { // eslint-disable-line class-methods-use-this
try {
const data = fs.readFileSync(`${__dirname}/models/mockData.json`, { encoding: 'utf8' });
const returnData = JSON.parse(data);
return returnData;
} catch (err) {
throw err;
}
}
}
有了这段代码,您实际上可以catch
使用 Jest 以两种不同的方式测试您的块代码:
beforeEach(() => {
fs.readFileSync = jest.fn();
});
afterEach(() => {
fs.readFileSync.mockClear();
});
test('Async expect test', () => {
fs.readFileSync.mockReturnValue(undefined);
const result = service.getData();
expect(result).rejects.toThrow();
});
test('Async / await test', async() => {
fs.readFileSync.mockReturnValue(undefined);
try {
await service.getData();
} catch (err) {
expect(err.name).toEqual('TypeError');
expect(err.message).toEqual(`Cannot read property 'charCodeAt' of undefined`);
}
});
readFileSync
正如我之前建议的那样,它们都暗示要从fs
模块中模拟方法。你甚至可以fs
用 Jest 模拟整个模块。或者你可以嘲笑JSON.parse
. 有很多选项可以测试该catch
块。
推荐阅读
- javascript - 如何在 Windows 10 和 nodejs 中获取 tmp 文件夹的绝对路径?
- amazon-web-services - 共享 AWS 用户 ARN
- c++ - 如何将所有权从共享指针向量转移到另一个?
- vba - 如何在不使用选择的情况下更改当前段落的格式
- javascript - 复选框切换状态后 ChromeVox 无法读取跨度
- python - NameError:name 'create_model' is not defined ....我已经尝试从 keras 导入模型,但它没有解决它。如何解决?
- flutter - Flutter:如何使用 sharedPreferences 设置 Switch 的状态
- html - 动画取决于屏幕的宽度和高度
- angular - 我们在 mat-tooltip 中没有动态内容的选项吗?
- javascript - 无法通过 document.getElementById 找到一个元素,即使它应该在那里