diff options
author | Johannes Ewald <johannes.ewald@peerigon.com> | 2015-02-23 03:31:08 +0300 |
---|---|---|
committer | Johannes Ewald <johannes.ewald@peerigon.com> | 2015-02-23 03:31:08 +0300 |
commit | e70efd18f9e1d5993fc0a7f1decb5fe6720b3bd8 (patch) | |
tree | 78fd4ec2d58346f17aaf19b313d5864896143052 /lib | |
parent | 52e914dc8b447d1cf99dd946869e8eafb5b53ae4 (diff) |
Fix problems when global objects like JSON, etc. have been rewired
Fixes #40
Diffstat (limited to 'lib')
-rw-r--r-- | lib/__set__.js | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/lib/__set__.js b/lib/__set__.js index bdb5042..3e66b42 100644 --- a/lib/__set__.js +++ b/lib/__set__.js @@ -12,19 +12,30 @@ function __set__() { arguments.varName = arguments[0]; arguments.varValue = arguments[1]; + // Saving references to global objects and functions. Thus a test may even change these variables + // without interfering with rewire(). + // @see https://github.com/jhnns/rewire/issues/40 + arguments.refs = arguments[2] || { + isArray: Array.isArray, + TypeError: TypeError, + stringify: JSON.stringify + // We can't save eval() because eval() is a *special* global function + // That's why it can't be re-assigned in strict mode + //eval: eval + }; arguments.src = ""; arguments.revertArgs = []; - if (typeof arguments[0] === "object" && arguments.length === 1) { + if (typeof arguments[0] === "object") { arguments.env = arguments.varName; - if (!arguments.env || Array.isArray(arguments.env)) { - throw new TypeError("__set__ expects an object as env"); + if (!arguments.env || arguments.refs.isArray(arguments.env)) { + throw new arguments.refs.TypeError("__set__ expects an object as env"); } arguments.revertArgs[0] = {}; for (arguments.varName in arguments.env) { if (arguments.env.hasOwnProperty(arguments.varName)) { arguments.varValue = arguments.env[arguments.varName]; - arguments.src += arguments.varName + " = arguments.env[" + JSON.stringify(arguments.varName) + "]; "; + arguments.src += arguments.varName + " = arguments.env[" + arguments.refs.stringify(arguments.varName) + "]; "; try { // Allow tests to mock implicit globals // @see https://github.com/jhnns/rewire/issues/35 @@ -34,9 +45,9 @@ function __set__() { } } } - } else if (typeof arguments.varName === "string" && arguments.length === 2) { + } else if (typeof arguments.varName === "string") { if (!arguments.varName) { - throw new TypeError("__set__ expects a non-empty string as a variable name"); + throw new arguments.refs.TypeError("__set__ expects a non-empty string as a variable name"); } arguments.src = arguments.varName + " = arguments.varValue;"; try { @@ -47,9 +58,12 @@ function __set__() { arguments.revertArgs = [arguments.varName, undefined]; } } else { - throw new TypeError("__set__ expects an environment object or a non-empty string as a variable name"); + throw new arguments.refs.TypeError("__set__ expects an environment object or a non-empty string as a variable name"); } + // Passing our saved references on to the revert function + arguments.revertArgs[2] = arguments.refs; + eval(arguments.src); return function (revertArgs) { |