It's possible for async code to cause an error when Jasmine doesn't have any listeners registered internally. This causes Jasmine to crash (Node) or log to the console (browser) because of trying to call the nonexistent handler. This change doesn't fix the overall problem but it does ensure that the original error is logged rather than Jasmine's internal error.
111 lines
3.4 KiB
JavaScript
111 lines
3.4 KiB
JavaScript
describe("GlobalErrors", function() {
|
|
it("calls the added handler on error", function() {
|
|
var fakeGlobal = { onerror: null },
|
|
handler = jasmine.createSpy('errorHandler'),
|
|
errors = new jasmineUnderTest.GlobalErrors(fakeGlobal);
|
|
|
|
errors.install();
|
|
errors.pushListener(handler);
|
|
|
|
fakeGlobal.onerror('foo');
|
|
|
|
expect(handler).toHaveBeenCalledWith('foo');
|
|
});
|
|
|
|
it("only calls the most recent handler", function() {
|
|
var fakeGlobal = { onerror: null },
|
|
handler1 = jasmine.createSpy('errorHandler1'),
|
|
handler2 = jasmine.createSpy('errorHandler2'),
|
|
errors = new jasmineUnderTest.GlobalErrors(fakeGlobal);
|
|
|
|
errors.install();
|
|
errors.pushListener(handler1);
|
|
errors.pushListener(handler2);
|
|
|
|
fakeGlobal.onerror('foo');
|
|
|
|
expect(handler1).not.toHaveBeenCalled();
|
|
expect(handler2).toHaveBeenCalledWith('foo');
|
|
});
|
|
|
|
it("calls previous handlers when one is removed", function() {
|
|
var fakeGlobal = { onerror: null },
|
|
handler1 = jasmine.createSpy('errorHandler1'),
|
|
handler2 = jasmine.createSpy('errorHandler2'),
|
|
errors = new jasmineUnderTest.GlobalErrors(fakeGlobal);
|
|
|
|
errors.install();
|
|
errors.pushListener(handler1);
|
|
errors.pushListener(handler2);
|
|
|
|
errors.popListener();
|
|
|
|
fakeGlobal.onerror('foo');
|
|
|
|
expect(handler1).toHaveBeenCalledWith('foo');
|
|
expect(handler2).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("uninstalls itself, putting back a previous callback", function() {
|
|
var originalCallback = jasmine.createSpy('error'),
|
|
fakeGlobal = { onerror: originalCallback },
|
|
errors = new jasmineUnderTest.GlobalErrors(fakeGlobal);
|
|
|
|
expect(fakeGlobal.onerror).toBe(originalCallback);
|
|
|
|
errors.install();
|
|
|
|
expect(fakeGlobal.onerror).not.toBe(originalCallback);
|
|
|
|
errors.uninstall();
|
|
|
|
expect(fakeGlobal.onerror).toBe(originalCallback);
|
|
});
|
|
|
|
it("rethrows the original error when there is no handler", function() {
|
|
var fakeGlobal = { },
|
|
errors = new jasmineUnderTest.GlobalErrors(fakeGlobal),
|
|
originalError = new Error('nope');
|
|
|
|
errors.install();
|
|
|
|
try {
|
|
fakeGlobal.onerror(originalError);
|
|
} catch (e) {
|
|
expect(e).toBe(originalError);
|
|
}
|
|
|
|
errors.uninstall();
|
|
});
|
|
|
|
it("works in node.js", function() {
|
|
var fakeGlobal = {
|
|
process: {
|
|
on: jasmine.createSpy('process.on'),
|
|
removeListener: jasmine.createSpy('process.removeListener'),
|
|
listeners: jasmine.createSpy('process.listeners').and.returnValue(['foo']),
|
|
removeAllListeners: jasmine.createSpy('process.removeAllListeners')
|
|
}
|
|
},
|
|
handler = jasmine.createSpy('errorHandler'),
|
|
errors = new jasmineUnderTest.GlobalErrors(fakeGlobal);
|
|
|
|
errors.install();
|
|
expect(fakeGlobal.process.on).toHaveBeenCalledWith('uncaughtException', jasmine.any(Function));
|
|
expect(fakeGlobal.process.listeners).toHaveBeenCalledWith('uncaughtException');
|
|
expect(fakeGlobal.process.removeAllListeners).toHaveBeenCalledWith('uncaughtException');
|
|
|
|
errors.pushListener(handler);
|
|
|
|
var addedListener = fakeGlobal.process.on.calls.argsFor(0)[1];
|
|
addedListener(new Error('bar'));
|
|
|
|
expect(handler).toHaveBeenCalledWith(new Error('bar'));
|
|
|
|
errors.uninstall();
|
|
|
|
expect(fakeGlobal.process.removeListener).toHaveBeenCalledWith('uncaughtException', addedListener);
|
|
expect(fakeGlobal.process.on).toHaveBeenCalledWith('uncaughtException', 'foo');
|
|
});
|
|
});
|