Unit test is a must for autiomated CI/CD workflow. Here I record some challenges solved with Jest.
describe('module 1', () => {
test('dances', () => expect(module1.dance()).toBeTruthy())
})
Asynchronous Code
Jest runs tests in parallel so each test must have a clear termination point. If everything is synchronous, simply return an expect function will tell Jest where to stop.
The problem becomes apparent if the test callback is asynchronous.
describe('module 1', () => {
test('dances', async () => expect(module1.dance()).toBeTruthy())
})
The above code still functions well if module1.dance() is synchronous. What happens if the resolved value needs to be tested?
describe('module 1', () => {
test('dances', async () => expect(await module1.dance()).toBeTruthy())
})
The above is a simple solution to the simple question. What if the question becomes more complicated?
describe('module 1', done => {
test('dances', async () => {
expect.assertions(1)
const dance = await module1.dance()
dance.on('spin', speed => {
expect(speed).toBeGreaterThan(5)
done()
})
})
})
The above code is an example where the done function is useful. The test is considered finished when the done function is called inside the test. Another use case of done is the beforeAll hook.
beforeAll(async done => {
await dep1
await dep2
done()
})
Without the use of done, Jest will run the callback synchronously so the tests will start before dep1 and dep2 are resolved.

