如何在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块。
答案 0 :(得分:2)
您可以从readFileSync
模拟方法fs
强制其返回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;
}
}
}
有了此代码,您实际上可以使用Jest以两种不同的方式测试catch
块代码:
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
方法。您甚至可以使用Jest模拟整个fs
模块。或者,您可以仅嘲笑JSON.parse
。有很多选项可以测试catch
块。
答案 1 :(得分:0)
Jest有自己的异常测试方法,您可以使用toThrow。看起来像这样
test('throws on octopus', () => {
expect(() => {
drinkFlavor('octopus');
}).toThrow(); // Test the exception here
});
由于您的函数是异步,请尝试显式定义错误,然后使用await
来解决/拒绝该错误,之后您可以检查实际的rejection
< / p>
test('throws on octopus', () => {
await expect(user.getUserName(3)).rejects.toEqual({
error: 'User with 3 not found.',
});
});