diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index bea469dd..89587edb 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -49,7 +49,7 @@ var getJasmineRequireObj = (function (jasmineGlobal) { j$.errors = jRequire.errors(); j$.Any = jRequire.Any(j$); j$.Anything = jRequire.Anything(j$); - j$.CallTracker = jRequire.CallTracker(); + j$.CallTracker = jRequire.CallTracker(j$); j$.MockDate = jRequire.MockDate(); j$.Clock = jRequire.Clock(); j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(); diff --git a/spec/core/CallTrackerSpec.js b/spec/core/CallTrackerSpec.js index ffccc538..ac4c0210 100644 --- a/spec/core/CallTrackerSpec.js +++ b/spec/core/CallTrackerSpec.js @@ -102,4 +102,20 @@ describe("CallTracker", function() { expect(callTracker.all()).toEqual([]); expect(callTracker.mostRecent()).toBeFalsy(); }); + + it("allows object arguments to be shallow cloned", function() { + var callTracker = new jasmineUnderTest.CallTracker(); + callTracker.saveArgumentsByValue(); + + var originalArg = {"foo": "bar"}; + callTracker.track({object: {}, args: [originalArg]}); + expect(callTracker.mostRecent().args[0]).not.toBe(originalArg); + + var anotherArg = {"foo": "bar", "baz": "foo"}; + callTracker.track({object: {}, args: [ + anotherArg, false, undefined, null, NaN, "", 0, 1.0, ['test', 123] + ]}); + expect(callTracker.mostRecent().args[0]).not.toBe(anotherArg); + }); + }); diff --git a/src/core/CallTracker.js b/src/core/CallTracker.js index b80e6a86..3fbe920d 100644 --- a/src/core/CallTracker.js +++ b/src/core/CallTracker.js @@ -1,9 +1,26 @@ -getJasmineRequireObj().CallTracker = function() { +getJasmineRequireObj().CallTracker = function(j$) { function CallTracker() { var calls = []; + var opts = {}; + + function argCloner(context) { + debugger; + var clonedArgs = []; + j$.util.argsToArray(context.args).forEach(function(arg) { + if(Object.prototype.toString.apply(arg) === '[object Object]') { + clonedArgs.push(j$.util.clone(arg)); + } else { + clonedArgs.push(arg); + } + }); + context.args = clonedArgs; + } this.track = function(context) { + if(opts.cloneArgs) { + argCloner(context); + } calls.push(context); }; @@ -44,6 +61,11 @@ getJasmineRequireObj().CallTracker = function() { this.reset = function() { calls = []; }; + + this.saveArgumentsByValue = function() { + opts.cloneArgs = true; + }; + } return CallTracker; diff --git a/src/core/requireCore.js b/src/core/requireCore.js index 571cf48a..51c82285 100644 --- a/src/core/requireCore.js +++ b/src/core/requireCore.js @@ -27,7 +27,7 @@ var getJasmineRequireObj = (function (jasmineGlobal) { j$.errors = jRequire.errors(); j$.Any = jRequire.Any(j$); j$.Anything = jRequire.Anything(j$); - j$.CallTracker = jRequire.CallTracker(); + j$.CallTracker = jRequire.CallTracker(j$); j$.MockDate = jRequire.MockDate(); j$.Clock = jRequire.Clock(); j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler();