UNPKG

tapes

Version:

A more robust tap-producing test harness for node and browsers. Adds beforeEach, afterEach, etc.

96 lines (73 loc) 2.17 kB
var async = require('async'); var delimiter; function tapes (tape, opts) { // Allow consumers of `tapes` to patch the core `tape` library. test.Test = tape.Test; delimiter = opts && opts.delimiter || ' '; test.only = function (name, fn, _before, _after) { return test(name, fn, _before, _after, true); }; test.skip = function (name, fn, _before, _after) { return test(name, fn, _before, _after, false, true); }; return function (name, fn, _before, _after, only) { return test(tape, name, fn, _before, _after, only); }; } function test (tape, name, fn, _before, _after, only, skip) { var before = _before || []; var after = _after || []; var testFn = only ? tape.only : skip ? tape.skip : tape; testFn(name, function (t) { var tEnd = t.end.bind(t); t.beforeEach = function (fn) { before.push(fn); }; t.afterEach = function (fn) { after.push(fn); }; t.test = function (tName, tFn, only, skip) { var tTestFn = only ? test.only : skip ? test.skip : test; tTestFn(tape, name + delimiter + tName, function (q) { var qEnd = q.end.bind(q); var qPlan = q.plan.bind(q); var executedAfters = false; q.end = function () { runWrapperFns(after, function () { executedAfters = true; qEnd(); }); }; q.plan = function (numberofAssertions) { qPlan(numberofAssertions); }; q.on('end', function (num) { if (!executedAfters) runWrapperFns(after, function () { executedAfters = true; }); }); tFn(q); }, before.slice(0), after.slice(0)); }; t.test.only = function (tName, tFn) { return t.test(tName, tFn, true); }; t.test.skip = function (tName, tFn) { return t.test(tName, tFn, false, true); }; runWrapperFns(before, function () { fn(t); }); }); }; function runWrapperFns (fns, callback) { callback = callback || function () {}; async.eachSeries(fns, function (fn, done) { fn({end: done}); }, callback); } module.exports = tapes;