如何在 es6 类上测试 catch block
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;
使用 Jest ,我如何编写测试用例来覆盖 catch block 。
最佳答案
您可以模拟 fs
中的方法 readFileSync
以强制其返回 undefined
。 JSON.parse(undefined)
会抛出错误,因此您可以检查代码的 catch 部分。
fs.readFileSync = jest.fn()
fs.readFileSync.mockReturnValue(undefined);
首先,在 catch
端,您应该抛出错误。从我的 Angular 来看,在管理错误时仅仅返回它并不是一个好的做法。但确实有人这么做。
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;
}
}
}
有了这段代码,您实际上可以使用 Jest 以两种不同的方式测试您的 catch
block 代码:
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`);
}
});
它们都意味着模拟来自 fs
模块的 readFileSync
方法,正如我之前建议的那样。您甚至可以使用 Jest 模拟整个 fs
模块。或者您可以只是模拟 JSON.parse
。有很多选项可以测试 catch
block 。
关于javascript - 如何使用 jest Nodejs 测试 catch block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573031/