Вы можете смоделировать метод 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;
}
}
}
Имея этот код, вы можете на самом деле протестировать свой 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
.