diff --git a/lib/assert.js b/lib/assert.js index 7e18a071e9c988..863651d2dcc364 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -283,6 +283,10 @@ function expectedException(actual, expected) { function _throws(shouldThrow, block, expected, message) { var actual; + if (!util.isFunction(block)) { + throw new TypeError('block must be a function'); + } + if (util.isString(expected)) { message = expected; expected = null; diff --git a/test/parallel/test-assert.js b/test/parallel/test-assert.js index 13dffe2fe011e9..4b959d04824fe2 100644 --- a/test/parallel/test-assert.js +++ b/test/parallel/test-assert.js @@ -267,8 +267,6 @@ try { var args = (function() { return arguments; })(); a.throws(makeBlock(a.deepEqual, [], args)); a.throws(makeBlock(a.deepEqual, args, [])); - -console.log('All OK'); assert.ok(gotError); @@ -329,3 +327,38 @@ try { assert.equal(e.generatedMessage, false, 'Message incorrectly marked as generated'); } + +// Verify that throws() and doesNotThrow() throw on non-function block +function testBlockTypeError(method, block) { + var threw = true; + + try { + method(block); + threw = false; + } catch (e) { + assert.equal(e.toString(), 'TypeError: block must be a function'); + } + + assert.ok(threw); +} + +testBlockTypeError(assert.throws, 'string'); +testBlockTypeError(assert.doesNotThrow, 'string'); +testBlockTypeError(assert.throws, 1); +testBlockTypeError(assert.doesNotThrow, 1); +testBlockTypeError(assert.throws, true); +testBlockTypeError(assert.doesNotThrow, true); +testBlockTypeError(assert.throws, false); +testBlockTypeError(assert.doesNotThrow, false); +testBlockTypeError(assert.throws, []); +testBlockTypeError(assert.doesNotThrow, []); +testBlockTypeError(assert.throws, {}); +testBlockTypeError(assert.doesNotThrow, {}); +testBlockTypeError(assert.throws, /foo/); +testBlockTypeError(assert.doesNotThrow, /foo/); +testBlockTypeError(assert.throws, null); +testBlockTypeError(assert.doesNotThrow, null); +testBlockTypeError(assert.throws, undefined); +testBlockTypeError(assert.doesNotThrow, undefined); + +console.log('All OK');