From ed232548650c6ccfc24e56c9439322556753753c Mon Sep 17 00:00:00 2001 From: anseki Date: Fri, 10 Feb 2017 17:17:39 +0900 Subject: [PATCH] fix #1252 --- spec/core/matchers/toThrowErrorSpec.js | 24 ++++++++++++++++++++++++ src/core/matchers/toThrowError.js | 4 +++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/spec/core/matchers/toThrowErrorSpec.js b/spec/core/matchers/toThrowErrorSpec.js index c15e7129..bdba3edc 100644 --- a/spec/core/matchers/toThrowErrorSpec.js +++ b/spec/core/matchers/toThrowErrorSpec.js @@ -65,6 +65,30 @@ describe("toThrowError", function() { expect(result.message()).toEqual("Expected function to throw an Error, but it threw 4."); }); + function isNotRunningInBrowser() { + return typeof document === 'undefined' + } + + it("passes if thrown is an instanceof Error regardless of global that contains its constructor", function() { + if (isNotRunningInBrowser()) { + return; + } + + var matcher = jasmineUnderTest.matchers.toThrowError(), + iframe = document.body.appendChild(document.createElement("iframe")), + iframeDocument = iframe.contentDocument, + result; + + iframeDocument.body.appendChild(iframeDocument.createElement("script")) + .textContent = "function method() { throw new Error('foo'); }"; + + result = matcher.compare(iframe.contentWindow.method); + expect(result.pass).toBe(true); + expect(result.message).toEqual("Expected function not to throw an Error, but it threw Error."); + + document.body.removeChild(iframe); + }); + it("fails with the correct message if thrown is a falsy value", function() { var matcher = jasmineUnderTest.matchers.toThrowError(), fn = function() { diff --git a/src/core/matchers/toThrowError.js b/src/core/matchers/toThrowError.js index 67a880f9..f6859c61 100644 --- a/src/core/matchers/toThrowError.js +++ b/src/core/matchers/toThrowError.js @@ -28,7 +28,9 @@ getJasmineRequireObj().toThrowError = function(j$) { return fail; } - if (!(thrown instanceof Error)) { + // Get Error constructor of thrown + if (!thrown || !thrown.constructor || !thrown.constructor.constructor || + !(thrown instanceof (thrown.constructor.constructor('return this')()).Error)) { fail.message = function() { return 'Expected function to throw an Error, but it threw ' + j$.pp(thrown) + '.'; }; return fail; }