promise-mock
Version:
Promise mock library for synchronous Promise testing
100 lines (81 loc) • 2.2 kB
JavaScript
import Promise from 'promise-polyfill';
var root = typeof window === 'undefined' ? global : window;
function PromiseMock() {
Promise.apply(this, arguments);
}
PromiseMock.prototype = Object.create(Promise.prototype);
Object.keys(Promise).forEach(function (key) {
PromiseMock[key] = Promise[key];
});
// Queue of waiting callbacks
PromiseMock.waiting = [];
/**
* Execute a pending Promise
*/
PromiseMock.run = function run(count) {
var runTimes = count ? count : 1;
if (PromiseMock.waiting.length === 0) {
throw new Error('No Promises waiting. Can\'t Promise.run()')
}
while (runTimes > 0 && PromiseMock.waiting.length > 0) {
PromiseMock.waiting.shift()();
runTimes--;
}
};
/**
* Execute all pending Promises
*
* @param strict boolean Throw error if none waiting
*/
PromiseMock.runAll = function runAll(strict) {
if (strict !== false && PromiseMock.waiting.length === 0) {
throw new Error('No Promises waiting. Can\'t Promise.runAll()')
}
while (PromiseMock.waiting.length > 0) {
PromiseMock.run();
}
};
PromiseMock._orginal = null;
PromiseMock.install = function install() {
PromiseMock._original = root.Promise;
PromiseMock._originalImmediate = Promise._immediateFn;
// Update the immediate function to push to queue
Promise._immediateFn = function mockImmediateFn(fn) {
PromiseMock.waiting.push(fn);
};
root.Promise = PromiseMock;
};
PromiseMock.uninstall = function uninstall() {
PromiseMock.clear();
if (PromiseMock._original) {
root.Promise = PromiseMock._original;
}
if (PromiseMock._originalImmediate) {
Promise._immediateFn = PromiseMock._originalImmediate;
}
};
/**
* Get the result of a Promise synchronously, throws on Promise reject
* @param {Promise} promise
* @returns {*}
*/
PromiseMock.getResult = function result(promise) {
var result, error;
promise.then(function (promResult) {
result = promResult;
}, function (promError) {
error = promError;
});
PromiseMock.runAll();
if (error) {
throw error;
}
return result;
};
/**
* Clear all pending Promises
*/
PromiseMock.clear = function clear() {
PromiseMock.waiting = [];
};
export default PromiseMock;