Daniel Cousens
7 years ago
5 changed files with 156 additions and 78 deletions
@ -0,0 +1,66 @@ |
|||
// TODO: move to own dependency
|
|||
function mockme (f) { |
|||
var mocks = [] |
|||
|
|||
function mock (constructor, functionName, func, n) { |
|||
n = n || Infinity |
|||
|
|||
var initial = constructor[functionName] |
|||
var context = constructor.constructor.name !== 'Function' ? constructor : null |
|||
function __mock () { |
|||
if (func.calls > n) throw new RangeError('Exceeded expected number of calls') |
|||
var r = func.apply(context, arguments) |
|||
++func.calls |
|||
return r |
|||
} |
|||
func.calls = 0 |
|||
func.expected = n |
|||
func.reset = function reset () { |
|||
constructor[functionName] = initial |
|||
} |
|||
constructor[functionName] = __mock |
|||
mocks.push(func) |
|||
} |
|||
|
|||
function stub (func, n) { |
|||
n = n || Infinity |
|||
|
|||
function __stub () { |
|||
if (func.calls > n) throw new RangeError('Exceeded expected number of calls') |
|||
var r = func.apply(null, arguments) |
|||
++func.calls |
|||
return r |
|||
} |
|||
func.calls = 0 |
|||
func.expected = n |
|||
|
|||
mocks.push(func) |
|||
return __stub |
|||
} |
|||
|
|||
return function run () { |
|||
var err |
|||
try { |
|||
f.apply({ |
|||
mock: mock, |
|||
stub: stub |
|||
}, arguments) |
|||
} catch (e) { |
|||
err = e |
|||
} |
|||
|
|||
mocks.forEach(function (x) { |
|||
if (!err) { |
|||
if (x.expected !== Infinity && x.calls !== x.expected) { |
|||
err = new RangeError('Too few calls') |
|||
} |
|||
} |
|||
|
|||
if (x.reset) x.reset() |
|||
}) |
|||
|
|||
if (err) throw err |
|||
} |
|||
} |
|||
|
|||
module.exports = mockme |
Loading…
Reference in new issue