Evil Buck
Evil Buck

Reputation: 1068

Disable error handling for mocha.js

Does anyone know if there a way to disable error handling by Mocha?

I'd really like to let the exception bubble up and be handled by the browser during debugging.

Update: The context is this. - Some code throw's an unexpected error. - I would like to disable "try/catch" (something like jasmine's tests do) and be thrown into the debugger in chrome.

This way I can inspect the current state of the application at that moment. It sounds like there isn't something built in, and I will need to manually do this each time I get some odd error in a test. Maybe by wrapping my code with

try {
  somethingThatBreaks();
} catch(e) {
  debugger;
}

Upvotes: 4

Views: 3117

Answers (3)

AlexeyP0708
AlexeyP0708

Reputation: 432

mocha.options.allowUncaught=true But in this case, the rest of the tests will break if the error is not caught within mocha. Disabling try{} catch(){} in mocha will only be useful when debugging.

To create a test, I suggest using the construction

(for browser)

try{
   throw new Error()
} catch (e){
   // Let's say it's called in a yor error listeners.
   e.handler=()=>{
      done(e)
   }
   let event= new ErrorEvent('error',{error:e})
   window.dispatchEvent(event);
   
}

Upvotes: 0

Louis
Louis

Reputation: 151391

Mocha installs its own onerror handler to trap exceptions that may occur in asynchronous code. You can disable it with:

window.onerror = undefined;

This is dangerous. You should do this only when you must absolutely do so. If you make this a routine thing, Mocha will completely miss errors that happen in asynchronous code.

If what you want to do is let exceptions in synchronous code bubble up, I'm not seeing what this would accomplish. If you want to inspect the exception before Mocha touches it, a try...catch block wrapping your test will do this.

Upvotes: 2

AdrianCooney
AdrianCooney

Reputation: 703

Mocha's error handling is contained in the following code:

if (this.async) {
  try {
    this.fn.call(ctx, function(err){
      if (err instanceof Error || toString.call(err) === "[object Error]") return done(err);
      if (null != err) return done(new Error('done() invoked with non-Error: ' + err));
      done();
    });
  } catch (err) {
    done(err);
  }
  return;
}

// sync
try {
  if (!this.pending) this.fn.call(ctx);
  this.duration = new Date - start;
  fn();
} catch (err) {
  fn(err);
}

You could possibly throw the error with the catch (or remove the try..catch entirely) however it would most likely break the test suite if a test fails.

Upvotes: 0

Related Questions