Browse Source

assert: throw when block is not a function

Currently, anything passed as the block argument to throws()
and doesNotThrow() is interpreted as a function, which can
lead to unexpected results. This commit checks the type of
block, and throws a TypeError if it is not a function.

Fixes: https://github.com/iojs/io.js/issues/275
PR-URL: https://github.com/iojs/io.js/pull/308
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
v1.8.0-commit
cjihrig 10 years ago
parent
commit
14dc9175eb
  1. 4
      lib/assert.js
  2. 37
      test/parallel/test-assert.js

4
lib/assert.js

@ -283,6 +283,10 @@ function expectedException(actual, expected) {
function _throws(shouldThrow, block, expected, message) { function _throws(shouldThrow, block, expected, message) {
var actual; var actual;
if (!util.isFunction(block)) {
throw new TypeError('block must be a function');
}
if (util.isString(expected)) { if (util.isString(expected)) {
message = expected; message = expected;
expected = null; expected = null;

37
test/parallel/test-assert.js

@ -267,8 +267,6 @@ try {
var args = (function() { return arguments; })(); var args = (function() { return arguments; })();
a.throws(makeBlock(a.deepEqual, [], args)); a.throws(makeBlock(a.deepEqual, [], args));
a.throws(makeBlock(a.deepEqual, args, [])); a.throws(makeBlock(a.deepEqual, args, []));
console.log('All OK');
assert.ok(gotError); assert.ok(gotError);
@ -329,3 +327,38 @@ try {
assert.equal(e.generatedMessage, false, assert.equal(e.generatedMessage, false,
'Message incorrectly marked as generated'); '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');

Loading…
Cancel
Save