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()
})
When you cannot access the rejecting promise
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))
})
})
How can Jasmine see an unhandled error?
Jasmine can detect unhandled errors by listening to the global
error
Show archive.org snapshot
and
unhandledrejection
Show archive.org snapshot
events.