diff --git a/packages/ember-metal/lib/error_handler.js b/packages/ember-metal/lib/error_handler.js index 32a393218ff..d2f30c1d529 100644 --- a/packages/ember-metal/lib/error_handler.js +++ b/packages/ember-metal/lib/error_handler.js @@ -34,6 +34,9 @@ export function dispatchError(error) { } // allows testing adapter to override dispatch +export function getDispatchOverride() { + return dispatchOverride; +} export function setDispatchOverride(handler) { dispatchOverride = handler; } diff --git a/packages/ember-metal/lib/run_loop.js b/packages/ember-metal/lib/run_loop.js index cb28f4ab1fa..748ff8b0bd6 100644 --- a/packages/ember-metal/lib/run_loop.js +++ b/packages/ember-metal/lib/run_loop.js @@ -2,7 +2,7 @@ import { GUID_KEY } from 'ember-utils'; import { assert } from './debug'; import { isTesting } from './testing'; import { - getOnerror, + dispatchError, setOnerror } from './error_handler'; import { @@ -21,7 +21,7 @@ function onEnd(current, next) { const onErrorTarget = { get onerror() { - return getOnerror(); + return dispatchError; }, set onerror(handler) { return setOnerror(handler); diff --git a/packages/ember-metal/tests/run_loop/onerror_test.js b/packages/ember-metal/tests/run_loop/onerror_test.js index 78df6a11e9a..df10fc3b8d7 100644 --- a/packages/ember-metal/tests/run_loop/onerror_test.js +++ b/packages/ember-metal/tests/run_loop/onerror_test.js @@ -1,5 +1,6 @@ import run from '../../run_loop'; -import { setOnerror, getOnerror } from '../../error_handler'; +import { setOnerror, getOnerror, setDispatchOverride, getDispatchOverride } from '../../error_handler'; +import { isTesting, setTesting } from '../../testing'; QUnit.module('system/run_loop/onerror_test'); @@ -23,13 +24,20 @@ QUnit.test('With Ember.onerror undefined, errors in Ember.run are thrown', funct QUnit.test('With Ember.onerror set, errors in Ember.run are caught', function () { let thrown = new Error('Boom!'); let original = getOnerror(); + let originalDispatchOverride = getDispatchOverride(); + let originalIsTesting = isTesting(); let caught; setOnerror(error => { caught = error; }); + setDispatchOverride(null); + setTesting(false); + try { run(() => { throw thrown; }); } finally { setOnerror(original); + setDispatchOverride(originalDispatchOverride); + setTesting(originalIsTesting); } deepEqual(caught, thrown); diff --git a/packages/ember-testing/tests/adapters_test.js b/packages/ember-testing/tests/adapters_test.js index 9c7dc9da54f..8647ee33bdd 100644 --- a/packages/ember-testing/tests/adapters_test.js +++ b/packages/ember-testing/tests/adapters_test.js @@ -12,9 +12,11 @@ QUnit.module('ember-testing Adapters', { originalQUnit = window.QUnit; }, teardown() { - run(App, App.destroy); - App.removeTestHelpers(); - App = null; + if (App) { + run(App, App.destroy); + App.removeTestHelpers(); + App = null; + } Test.adapter = originalAdapter; window.QUnit = originalQUnit; @@ -68,3 +70,18 @@ QUnit.test('Adapter is used by default (if QUnit is not available)', function() ok(Test.adapter instanceof Adapter); ok(!(Test.adapter instanceof QUnitAdapter)); }); + +QUnit.test('With Ember.Test.adapter set, errors in Ember.run are caught', function () { + let thrown = new Error('Boom!'); + + let caught; + Test.adapter = QUnitAdapter.create({ + exception(error) { + caught = error; + } + }); + + run(() => { throw thrown; }); + + deepEqual(caught, thrown); +});