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