Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

Commit 0a06874

Browse files
JiaLiPassionmhevery
authored andcommitted
fix(test): fix #718, use async test to do unhandle promise rejection test (#726)
1 parent 55cf064 commit 0a06874

File tree

1 file changed

+77
-92
lines changed

1 file changed

+77
-92
lines changed

Diff for: test/browser/browser.spec.ts

+77-92
Original file line numberDiff line numberDiff line change
@@ -534,105 +534,90 @@ describe('Zone', function() {
534534
});
535535
});
536536

537-
it('should support window.addEventListener(unhandledrejection)', function(done) {
538-
if (!promiseUnhandleRejectionSupport()) {
539-
done();
540-
return;
541-
}
542-
(Zone as any)[zoneSymbol('ignoreConsoleErrorUncaughtError')] = true;
543-
rootZone.fork({name: 'promise'}).run(function() {
544-
const listener = (evt: any) => {
545-
expect(evt.type).toEqual('unhandledrejection');
546-
expect(evt.promise.constructor.name).toEqual('Promise');
547-
expect(evt.reason.message).toBe('promise error');
548-
window.removeEventListener('unhandledrejection', listener);
549-
done();
550-
};
551-
window.addEventListener('unhandledrejection', listener);
552-
new Promise((resolve, reject) => {
553-
throw new Error('promise error');
554-
});
555-
});
556-
});
557-
558-
it('should support window.addEventListener(rejectionhandled)', function(done) {
559-
if (!promiseUnhandleRejectionSupport()) {
560-
done();
561-
return;
562-
}
563-
(Zone as any)[zoneSymbol('ignoreConsoleErrorUncaughtError')] = true;
564-
rootZone.fork({name: 'promise'}).run(function() {
565-
const listener = (evt: any) => {
566-
window.removeEventListener('unhandledrejection', listener);
567-
p.catch(reason => {});
568-
};
569-
window.addEventListener('unhandledrejection', listener);
570-
571-
window.addEventListener('rejectionhandled', (evt: any) => {
572-
expect(evt.type).toEqual('rejectionhandled');
573-
expect(evt.promise.constructor.name).toEqual('Promise');
574-
expect(evt.reason.message).toBe('promise error');
575-
done();
576-
});
577-
const p = new Promise((resolve, reject) => {
578-
throw new Error('promise error');
579-
});
580-
});
581-
});
582-
583-
it('should support multiple window.addEventListener(unhandledrejection)', function(done) {
584-
if (!promiseUnhandleRejectionSupport()) {
585-
done();
586-
return;
587-
}
588-
(Zone as any)[zoneSymbol('ignoreConsoleErrorUncaughtError')] = true;
589-
rootZone.fork({name: 'promise'}).run(function() {
590-
const listener1 = (evt: any) => {
591-
expect(evt.type).toEqual('unhandledrejection');
592-
expect(evt.promise.constructor.name).toEqual('Promise');
593-
expect(evt.reason.message).toBe('promise error');
594-
window.removeEventListener('unhandledrejection', listener1);
595-
};
596-
const listener2 = (evt: any) => {
597-
expect(evt.type).toEqual('unhandledrejection');
598-
expect(evt.promise.constructor.name).toEqual('Promise');
599-
expect(evt.reason.message).toBe('promise error');
600-
window.removeEventListener('unhandledrejection', listener2);
601-
done();
602-
};
603-
window.addEventListener('unhandledrejection', listener1);
604-
window.addEventListener('unhandledrejection', listener2);
605-
new Promise((resolve, reject) => {
606-
throw new Error('promise error');
607-
});
608-
});
609-
});
537+
});
610538

611-
it('should be able to covert element with event listener to json without cyclic error',
612-
function() {
613-
const eventListenerSpy = jasmine.createSpy('eventListener');
614-
let elemThrowErrorWhenToJson = false;
615-
try {
616-
JSON.stringify(button);
617-
} catch (err) {
618-
elemThrowErrorWhenToJson = true;
539+
describe('unhandle promise rejection', () => {
540+
const AsyncTestZoneSpec = (Zone as any)['AsyncTestZoneSpec'];
541+
const asyncTest = function(testFn: Function) {
542+
return (done: Function) => {
543+
let asyncTestZone: Zone =
544+
Zone.current.fork(new AsyncTestZoneSpec(done, (error: Error) => {
545+
fail(error);
546+
}, 'asyncTest'));
547+
asyncTestZone.run(testFn);
548+
};
549+
};
550+
551+
it('should support window.addEventListener(unhandledrejection)', asyncTest(() => {
552+
if (!promiseUnhandleRejectionSupport()) {
553+
return;
619554
}
555+
(Zone as any)[zoneSymbol('ignoreConsoleErrorUncaughtError')] = true;
556+
rootZone.fork({name: 'promise'}).run(function() {
557+
const listener = (evt: any) => {
558+
window.removeEventListener('unhandledrejection', listener);
559+
expect(evt.type).toEqual('unhandledrejection');
560+
expect(evt.promise.constructor.name).toEqual('Promise');
561+
expect(evt.reason.message).toBe('promise error');
562+
};
563+
window.addEventListener('unhandledrejection', listener);
564+
new Promise((resolve, reject) => {
565+
throw new Error('promise error');
566+
});
567+
});
568+
}));
620569

621-
// in chrome mobile, dom element will throw
622-
// cyclic error when call JSON.stringify,
623-
// so we just ignore it.
624-
if (elemThrowErrorWhenToJson) {
570+
it('should support window.addEventListener(rejectionhandled)', asyncTest(() => {
571+
if (!promiseUnhandleRejectionSupport()) {
625572
return;
626573
}
627-
628-
Zone.current.run(function() {
629-
button.addEventListener('click', eventListenerSpy);
574+
(Zone as any)[zoneSymbol('ignoreConsoleErrorUncaughtError')] = true;
575+
rootZone.fork({name: 'promise'}).run(function() {
576+
const listener = (evt: any) => {
577+
window.removeEventListener('unhandledrejection', listener);
578+
p.catch(reason => {});
579+
};
580+
window.addEventListener('unhandledrejection', listener);
581+
582+
const handledListener = (evt: any) => {
583+
window.removeEventListener('rejectionhandled', handledListener);
584+
expect(evt.type).toEqual('rejectionhandled');
585+
expect(evt.promise.constructor.name).toEqual('Promise');
586+
expect(evt.reason.message).toBe('promise error');
587+
};
588+
589+
window.addEventListener('rejectionhandled', handledListener);
590+
const p = new Promise((resolve, reject) => {
591+
throw new Error('promise error');
592+
});
630593
});
594+
}));
631595

632-
expect(function() {
633-
JSON.stringify(button);
634-
}).not.toThrow();
635-
});
596+
it('should support multiple window.addEventListener(unhandledrejection)', asyncTest(() => {
597+
if (!promiseUnhandleRejectionSupport()) {
598+
return;
599+
}
600+
(Zone as any)[zoneSymbol('ignoreConsoleErrorUncaughtError')] = true;
601+
rootZone.fork({name: 'promise'}).run(function() {
602+
const listener1 = (evt: any) => {
603+
window.removeEventListener('unhandledrejection', listener1);
604+
expect(evt.type).toEqual('unhandledrejection');
605+
expect(evt.promise.constructor.name).toEqual('Promise');
606+
expect(evt.reason.message).toBe('promise error');
607+
};
608+
const listener2 = (evt: any) => {
609+
window.removeEventListener('unhandledrejection', listener2);
610+
expect(evt.type).toEqual('unhandledrejection');
611+
expect(evt.promise.constructor.name).toEqual('Promise');
612+
expect(evt.reason.message).toBe('promise error');
613+
};
614+
window.addEventListener('unhandledrejection', listener1);
615+
window.addEventListener('unhandledrejection', listener2);
616+
new Promise((resolve, reject) => {
617+
throw new Error('promise error');
618+
});
619+
});
620+
}));
636621
});
637622
});
638623
});

0 commit comments

Comments
 (0)