Search code examples
node.jsasynchronousassert

assert.throws says => Missing expected exception


I am using this chunk of code:

       assert.throws(async () => {
            patientSubscriber = await PatientSubscriber.create({
                isSubscribed: true,
                patient: patient._id,
                subscriber: user._id
            });
        },{
             message: /foo/
        });

when I run it I get this:

AssertionError [ERR_ASSERTION]: Missing expected exception.

The assert API is: https://nodejs.org/api/assert.html#assert_assert_throws_fn_error_message

Maybe I am hitting this issue? https://github.com/nodejs/node-v0.x-archive/issues/8368

Anyone know what that error is about?


Solution

  • The error means that there was no exception while it was expected. async functions are syntactic sugar for promises. They never throw exceptions but may return rejected promise.

    Since the assertion is expected to be synchronous, it's impossible to assert promises this way; the entire callstack should be promise-based.

    As it was mentioned in comments, assert.rejects appeared in Node 10 and results in rejected promise on assertion fail.

    In case promises are handled by a caller (e.g. in most testing frameworks), rejected promise needs to be returned from current function:

    it('...', async () {
      await assert.rejects((async () => {})()); // current function returns rejected promise
    });
    

    In case assertion promises aren't handled (e.g. in production), they result in UnhandledPromiseRejectionWarning console output, not in exceptions. unhandledRejection handler can be set to handle asynchronous errors:

    process.on('unhandledRejection', err => {
      console.error(err);
      process.exit(1);
    });
    
    ...
    
    assert.rejects((async () => {})());