66 lines
1.4 KiB
JavaScript
66 lines
1.4 KiB
JavaScript
// 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
|