Ryan Swanson Ryan Swanson - 3 months ago 74
Javascript Question

Karma passes test when promise is rejected during assertion

If the promise itself is rejected as in the

'does fail'
test, then the test fails as I would expect. If an assertion fails/error is thrown/promise is rejected in the "then" of the promise I get logging saying
ERROR: 'Unhandled promise rejection'
and the test passes anyway. How do I get it to fail on rejection rather than log that the rejection was unhandled?

import { expect } from 'chai';

describe.only('What?', () => {
const e = new Error('NOPE');

it('does fail', () => Promise.reject(e));

it('should fail when rejected', () => {
const promise = new Promise(r => r());

promise.then(() => Promise.reject(e));

return promise;
});

it('should fail when thrown, then caught then rejected', () => {
const promise = new Promise(r => r());

promise
.then(() => { throw e; })
.catch(() => Promise.reject('huh'));

return promise;
});

it('should fail/reject when thrown, then caught then rethrown', () => {
const promise = new Promise(r => r());

promise
.then(() => { throw e; })
.catch(er => { throw er; });

return promise;
});

it(`doesn't matter if I expect`, () => {
const promise = new Promise(r => r());

promise.then(() => {
expect(1).to.eq(2);
});

return promise;
});
});


Which then reports...

START:
What?
✖ does fail
✔ should fail when rejected
ERROR: 'Unhandled promise rejection', Error{stack: undefined}
✔ should fail when thrown, then caught then rejected
ERROR: 'Unhandled promise rejection', 'huh'
✔ should fail/reject when thrown, then caught then rethrown
ERROR: 'Unhandled promise rejection', Error{stack: undefined, line: 47567, sourceURL: 'http://localhost:9876/base/test/test_index.js?7f696b0b50c0a51c7a2fa5278582072b20241a3b'}
✔ doesn't matter if I expect
ERROR: 'Unhandled promise rejection', AssertionError{message: 'expected 1 to equal 2', showDiff: true, actual: 1, expected: 2, stack: 'AssertionError@http://localhost:9876/base/test/test_index.js?7f696b0b50c0a51c7a2fa5278582072b20241a3b:39222:25

Answer

You have to return the return value of the then(...), not the first promise you create.

Comments