sinon-as-promised
Version:
Sugar methods for using sinon.js stubs with promises
63 lines (54 loc) • 1.38 kB
JavaScript
;
var Promise = require('bluebird');
var sinon = require('sinon');
function thenable (promiseFactory) {
return Object.getOwnPropertyNames(Promise.prototype)
.filter(function (method) {
return method !== 'then';
})
.reduce(function (acc, method) {
acc[method] = function () {
var args = arguments;
var promise = this.then();
return promise[method].apply(promise, args);
};
return acc;
},
{
then: function (onFulfill, onReject) {
return promiseFactory().then(onFulfill, onReject);
}
});
}
function resolves (value) {
/*jshint validthis:true */
return this.returns(thenable(function () {
return new Promise(function (resolve) {
resolve(value);
});
}));
}
sinon.stub.resolves = resolves;
sinon.behavior.resolves = resolves;
function rejects (err) {
if (typeof err === 'string') {
err = new Error(err);
}
/*jshint validthis:true */
return this.returns(thenable(function () {
return new Promise(function (resolve, reject) {
reject(err);
});
}));
}
sinon.stub.rejects = rejects;
sinon.behavior.rejects = rejects;
module.exports = function (_Promise_) {
if (typeof _Promise_ !== 'function') {
throw new Error('A Promise constructor must be provided');
}
else {
Promise = _Promise_;
}
return sinon;
};