You have an async function that rejects:
async function failingFunction() {
throw new Error("Something went wrong")
}
When you call that function in a test, your test will fail:
it('has a test', function() {
failingFunction() // this will fail your test
})
The failure message will look like this:
Unhandled promise rejection: Error: Something went wrong
You can fix this by expecting the state of the returned promise:
it('has a test', async function() {
await expectAsync(failingFunction()).toBeRejected()
})
Sometimes you will not have access to the rejecting promise. This can happen if the failing function is called by another function, but its rejecting promise is never returned:
function wrappingFunction() {
// Note we're not returning the promise
failingFunction()
}
it('has a test', function() {
wrappingFunction() // no way to expect the promise state
})
In this case you can use
jasmine.spyOnGlobalErrorsAsync()
Show archive.org snapshot
to temporarily disable Jasmine's detection of unhandled errors:
it('has a test', async function() {
await jasmine.spyOnGlobalErrorsAsync(async function() {
wrappingFunction()
})
})
You can even make assertions on the unhandled error by accepting a spy in the callback:
it('has a test', async function() {
await jasmine.spyOnGlobalErrorsAsync(async function(globalErrorSpy) {
wrappingFunction()
expect(globalErrorSpy).toHaveBeenCalledWith(jasmine.any(Error))
})
})
Jasmine can detect unhandled errors by listening to the global
error
Show archive.org snapshot
and
unhandledrejection
Show archive.org snapshot
events.