Overview
Testing JavaScript asynchronous function with Jest.Reminders:
- A JavaScript asynchronous function always return a promise
- When an JavaScript asynchronous function throw an exception, the function really return a rejected Promise with a value.
- The Jest test must also be asynchronous
- As 02/2019 Jest cannot test for custom exception thrown.
The code
/////////////////////////////////////////////////////////
/// An async function that may throw an exception
export const anAsyncFuncThatThrow = async (fail) => { // Javascript async function always return a Promise
if(fail)
throw new Error('an error occured'); // Will return a Promise that is rejected with the error as value
return new Promise(function(resolve, reject) {
setTimeout( () => {
resolve("ok"); // Will return a Promise that is resolved/successful with "ok" as the value
}, 400);
});
}
/////////////////////////////////////////////////////////
/// An async function that may resolve or reject the returned promise
export const anAsyncFunc = async (rejectPromise) => { // Javascript async function always return a Promise
return new Promise(function(resolve, reject) {
setTimeout( () => {
if(rejectPromise)
reject('ko'); // Will return a Promise that is rejected with "ko" as the value
else
resolve("ok"); // Will return a Promise that is resolved/successful with "ok" as the value
}, 400);
});
}
The tests
import { anAsyncFuncThatThrow, anAsyncFunc } from './p';
describe('anAsyncFuncThatThrow', () => {
it('anAsyncFuncThatThrow succeed', async () => { // <= Do not forget the async keyword for the test
const throwException = false;
await expect( anAsyncFuncThatThrow(throwException) ).resolves.toEqual('ok'); // expect must be preceded by await
});
it('anAsyncFuncThatThrow throw', async () => { // <= Do not forget the async keyword for the test
const throwException = true;
await expect( anAsyncFuncThatThrow(throwException) ).rejects.toThrow(Error); // expect must be preceded by await
});
it('anAsyncFuncThatThrow throw check error message', async () => { // <= Do not forget the async key work for the test
const throwException = true;
await expect( anAsyncFuncThatThrow(throwException) ).rejects.toThrow('an error occured'); // expect must be preceded by await
});
});
describe('anAsyncFunc', () => {
it('anAsyncFunc succeed', async () => { // <= Do not forget the async keyword for the test
const reject = false;
await expect( anAsyncFunc(reject) ).resolves.toEqual('ok'); // expect must be preceded by await
});
it('anAsyncFunc failed/rejcted', async () => { // <= Do not forget the async keyword for the test
const reject = true;
await expect( anAsyncFunc(reject) ).rejects.toEqual('ko'); // expect must be preceded by await
});
});
No comments:
Post a Comment