mirror of https://gitee.com/bigwinds/arangodb
154 lines
3.8 KiB
JavaScript
154 lines
3.8 KiB
JavaScript
/**
|
|
* @depend ../sinon.js
|
|
* @depend stub.js
|
|
* @depend mock.js
|
|
*/
|
|
/*jslint eqeqeq: false, onevar: false, forin: true*/
|
|
/*global module, require, sinon*/
|
|
/**
|
|
* Collections of stubs, spies and mocks.
|
|
*
|
|
* @author Christian Johansen (christian@cjohansen.no)
|
|
* @license BSD
|
|
*
|
|
* Copyright (c) 2010-2013 Christian Johansen
|
|
*/
|
|
"use strict";
|
|
|
|
(function (sinon) {
|
|
var commonJSModule = typeof module == "object" && typeof require == "function";
|
|
var push = [].push;
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
if (!sinon && commonJSModule) {
|
|
sinon = require("../sinon");
|
|
}
|
|
|
|
if (!sinon) {
|
|
return;
|
|
}
|
|
|
|
function getFakes(fakeCollection) {
|
|
if (!fakeCollection.fakes) {
|
|
fakeCollection.fakes = [];
|
|
}
|
|
|
|
return fakeCollection.fakes;
|
|
}
|
|
|
|
function each(fakeCollection, method) {
|
|
var fakes = getFakes(fakeCollection);
|
|
|
|
for (var i = 0, l = fakes.length; i < l; i += 1) {
|
|
if (typeof fakes[i][method] == "function") {
|
|
fakes[i][method]();
|
|
}
|
|
}
|
|
}
|
|
|
|
function compact(fakeCollection) {
|
|
var fakes = getFakes(fakeCollection);
|
|
var i = 0;
|
|
while (i < fakes.length) {
|
|
fakes.splice(i, 1);
|
|
}
|
|
}
|
|
|
|
var collection = {
|
|
verify: function resolve() {
|
|
each(this, "verify");
|
|
},
|
|
|
|
restore: function restore() {
|
|
each(this, "restore");
|
|
compact(this);
|
|
},
|
|
|
|
verifyAndRestore: function verifyAndRestore() {
|
|
var exception;
|
|
|
|
try {
|
|
this.verify();
|
|
} catch (e) {
|
|
exception = e;
|
|
}
|
|
|
|
this.restore();
|
|
|
|
if (exception) {
|
|
throw exception;
|
|
}
|
|
},
|
|
|
|
add: function add(fake) {
|
|
push.call(getFakes(this), fake);
|
|
return fake;
|
|
},
|
|
|
|
spy: function spy() {
|
|
return this.add(sinon.spy.apply(sinon, arguments));
|
|
},
|
|
|
|
stub: function stub(object, property, value) {
|
|
if (property) {
|
|
var original = object[property];
|
|
|
|
if (typeof original != "function") {
|
|
if (!hasOwnProperty.call(object, property)) {
|
|
throw new TypeError("Cannot stub non-existent own property " + property);
|
|
}
|
|
|
|
object[property] = value;
|
|
|
|
return this.add({
|
|
restore: function () {
|
|
object[property] = original;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
if (!property && !!object && typeof object == "object") {
|
|
var stubbedObj = sinon.stub.apply(sinon, arguments);
|
|
|
|
for (var prop in stubbedObj) {
|
|
if (typeof stubbedObj[prop] === "function") {
|
|
this.add(stubbedObj[prop]);
|
|
}
|
|
}
|
|
|
|
return stubbedObj;
|
|
}
|
|
|
|
return this.add(sinon.stub.apply(sinon, arguments));
|
|
},
|
|
|
|
mock: function mock() {
|
|
return this.add(sinon.mock.apply(sinon, arguments));
|
|
},
|
|
|
|
inject: function inject(obj) {
|
|
var col = this;
|
|
|
|
obj.spy = function () {
|
|
return col.spy.apply(col, arguments);
|
|
};
|
|
|
|
obj.stub = function () {
|
|
return col.stub.apply(col, arguments);
|
|
};
|
|
|
|
obj.mock = function () {
|
|
return col.mock.apply(col, arguments);
|
|
};
|
|
|
|
return obj;
|
|
}
|
|
};
|
|
|
|
if (commonJSModule) {
|
|
module.exports = collection;
|
|
} else {
|
|
sinon.collection = collection;
|
|
}
|
|
}(typeof sinon == "object" && sinon || null));
|