Skip to content

Commit

Permalink
Merge pull request #268 from ljharb/throws_non_function_should_fail
Browse files Browse the repository at this point in the history
[Fix] Ensure that non-functions passed to `throws` fail the test, just like `assert`
  • Loading branch information
ljharb committed Mar 6, 2016
1 parent aa5bd84 commit 4c0d9e6
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/test.js
Expand Up @@ -425,7 +425,7 @@ Test.prototype['throws'] = function (fn, expected, msg, extra) {
expected = String(expected);
}

this._assert(passed, {
this._assert(typeof fn === 'function' && passed, {
message : defined(msg, 'should throw'),
operator : 'throws',
actual : caught && caught.error,
Expand Down
135 changes: 135 additions & 0 deletions test/throws.js
@@ -0,0 +1,135 @@
var tape = require('../');
var tap = require('tap');
var concat = require('concat-stream');

function fn() {
throw new TypeError('RegExp');
}

function getNonFunctionMessage(fn) {
try {
fn();
} catch (e) {
return e.message;
}
}

tape('throws', function (t) {
t.throws(fn);
t.end();
});

tape('throws (RegExp match)', function (t) {
t.throws(fn, /RegExp/);
t.end();
});

tape('throws (Function match)', function (t) {
t.throws(fn, TypeError);
t.end();
});

tap.test('failures', function (tt) {
tt.plan(1);

var test = tape.createHarness();
test.createStream().pipe(concat(function (body) {
tt.equal(
body.toString('utf8'),
'TAP version 13\n'
+ '# non functions\n'
+ 'not ok 1 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: |-\n'
+ ' undefined\n'
+ ' actual: |-\n'
+ " { [TypeError: " + getNonFunctionMessage() + "] message: '" + getNonFunctionMessage() + "' }\n"
+ ' ...\n'
+ 'not ok 2 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: |-\n'
+ ' undefined\n'
+ ' actual: |-\n'
+ " { [TypeError: " + getNonFunctionMessage(null) + "] message: '" + getNonFunctionMessage(null) + "' }\n"
+ ' ...\n'
+ 'not ok 3 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: |-\n'
+ ' undefined\n'
+ ' actual: |-\n'
+ " { [TypeError: " + getNonFunctionMessage(true) + "] message: '" + getNonFunctionMessage(true) + "' }\n"
+ ' ...\n'
+ 'not ok 4 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: |-\n'
+ ' undefined\n'
+ ' actual: |-\n'
+ " { [TypeError: " + getNonFunctionMessage(false) + "] message: '" + getNonFunctionMessage(false) + "' }\n"
+ ' ...\n'
+ 'not ok 5 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: |-\n'
+ ' undefined\n'
+ ' actual: |-\n'
+ " { [TypeError: " + getNonFunctionMessage('abc') + "] message: '" + getNonFunctionMessage('abc') + "' }\n"
+ ' ...\n'
+ 'not ok 6 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: |-\n'
+ ' undefined\n'
+ ' actual: |-\n'
+ " { [TypeError: " + getNonFunctionMessage(/a/g) + "] message: '" + getNonFunctionMessage(/a/g) + "' }\n"
+ ' ...\n'
+ 'not ok 7 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: |-\n'
+ ' undefined\n'
+ ' actual: |-\n'
+ " { [TypeError: " + getNonFunctionMessage([]) + "] message: '" + getNonFunctionMessage([]) + "' }\n"
+ ' ...\n'
+ 'not ok 8 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: |-\n'
+ ' undefined\n'
+ ' actual: |-\n'
+ " { [TypeError: " + getNonFunctionMessage({}) + "] message: '" + getNonFunctionMessage({}) + "' }\n"
+ ' ...\n'
+ '# function\n'
+ 'not ok 9 should throw\n'
+ ' ---\n'
+ ' operator: throws\n'
+ ' expected: undefined\n'
+ ' actual: undefined\n'
+ ' ...\n\n'
+ '1..9\n'
+ '# tests 9\n'
+ '# pass 0\n'
+ '# fail 9\n'
);
}));

test('non functions', function (t) {
t.plan(8);
t.throws();
t.throws(null);
t.throws(true);
t.throws(false);
t.throws('abc');
t.throws(/a/g);
t.throws([]);
t.throws({});
});

test('function', function (t) {
t.plan(1);
t.throws(function () {});
});
});

0 comments on commit 4c0d9e6

Please sign in to comment.