Skip to content

Commit

Permalink
internal: extract sinon type checking into own module
Browse files Browse the repository at this point in the history
  • Loading branch information
fatso83 committed Mar 26, 2023
1 parent 7d60f2d commit d523ef1
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 3 deletions.
5 changes: 3 additions & 2 deletions lib/sinon/create-stub-instance.js
@@ -1,10 +1,11 @@
"use strict";

const stub = require("./stub");
const sinonType = require("./util/core/sinon-type");
const forEach = require("@sinonjs/commons").prototypes.array.forEach;

function isStub(value) {
return value && value.throws && value.returns;
return sinonType.get(value) === "stub";
}

module.exports = function createStubInstance(constructor, overrides) {
Expand All @@ -13,7 +14,7 @@ module.exports = function createStubInstance(constructor, overrides) {
}

const stubInstance = Object.create(constructor.prototype);
stubInstance[Symbol.for("SinonType")] = "StubInstance";
sinonType.set(stubInstance, "stub-instance");

const stubbedObject = stub(stubInstance);

Expand Down
3 changes: 3 additions & 0 deletions lib/sinon/stub.js
Expand Up @@ -12,6 +12,7 @@ var spy = require("./spy");
var extend = require("./util/core/extend");
var getPropertyDescriptor = require("./util/core/get-property-descriptor");
var isEsModule = require("./util/core/is-es-module");
var sinonType = require("./util/core/sinon-type");
var wrapMethod = require("./util/core/wrap-method");
var throwOnFalsyObject = require("./throw-on-falsy-object");
var valueToString = require("@sinonjs/commons").valueToString;
Expand Down Expand Up @@ -58,6 +59,8 @@ function createStub(originalFunc) {
id: `stub#${uuid++}`,
});

sinonType.set(proxy, "stub");

return proxy;
}

Expand Down
22 changes: 22 additions & 0 deletions lib/sinon/util/core/sinon-type.js
@@ -0,0 +1,22 @@
"use strict";

const sinonTypeSymbolProperty = Symbol("SinonType");

module.exports = {
/**
* Set the type of a Sinon object to make it possible to identify it later at runtime
*
* @param {object|Function} object object/function to set the type on
* @param {string} type the named type of the object/function
*/
set(object, type) {
Object.defineProperty(object, sinonTypeSymbolProperty, {
value: type,
configurable: false,
enumerable: false,
});
},
get(object) {
return object && object[sinonTypeSymbolProperty];
},
};
3 changes: 2 additions & 1 deletion lib/sinon/util/core/wrap-method.js
Expand Up @@ -4,6 +4,7 @@
const noop = () => {};
var getPropertyDescriptor = require("./get-property-descriptor");
var extend = require("./extend");
const sinonType = require("./sinon-type");
var hasOwnProperty =
require("@sinonjs/commons").prototypes.object.hasOwnProperty;
var valueToString = require("@sinonjs/commons").valueToString;
Expand Down Expand Up @@ -232,7 +233,7 @@ module.exports = function wrapMethod(object, property, method) {
}
}
}
if (object[Symbol.for("SinonType")] === "StubInstance") {
if (sinonType.get(object) === "stub-instance") {
// this is simply to avoid errors after restoring if something should
// traverse the object in a cleanup phase, ref #2477
object[property] = noop;
Expand Down

0 comments on commit d523ef1

Please sign in to comment.