diff --git a/spec/core/ReportDispatcherSpec.js b/spec/core/ReportDispatcherSpec.js index 5c9fe06c..c1234e65 100644 --- a/spec/core/ReportDispatcherSpec.js +++ b/spec/core/ReportDispatcherSpec.js @@ -66,6 +66,39 @@ describe('ReportDispatcher', function() { expect(anotherReporter.bar).toHaveBeenCalledWith({ another: 'event' }); }); + it('passes each reporter a separate deep copy of the event', function() { + const runQueue = jasmine.createSpy('runQueue'); + const dispatcher = new jasmineUnderTest.ReportDispatcher( + ['foo', 'bar'], + runQueue + ); + const reporter = jasmine.createSpyObj('reporter', ['foo']); + const anotherReporter = jasmine.createSpyObj('anotherReporter', ['foo']); + const event = { + child: { + grandchild: 'something' + } + }; + dispatcher.addReporter(reporter); + dispatcher.addReporter(anotherReporter); + + dispatcher.foo(event); + + for (const fn of runQueue.calls.mostRecent().args[0].queueableFns) { + fn.fn(); + } + + expect(reporter.foo).toHaveBeenCalledWith(event); + expect(anotherReporter.foo).toHaveBeenCalledWith(event); + const receivedEvents = [reporter, anotherReporter].map(function(reporter) { + return reporter.foo.calls.mostRecent().args[0]; + }); + expect(receivedEvents[0]).not.toBe(event); + expect(receivedEvents[0]).not.toBe(receivedEvents[1]); + expect(receivedEvents[0].child).not.toBe(event.child); + expect(receivedEvents[0].child).not.toBe(receivedEvents[1].child); + }); + it("does not dispatch to a reporter if the reporter doesn't accept the method", function() { const runQueue = jasmine.createSpy('runQueue'), dispatcher = new jasmineUnderTest.ReportDispatcher(['foo'], runQueue), diff --git a/spec/core/integration/EnvSpec.js b/spec/core/integration/EnvSpec.js index b9536680..9a39db2e 100644 --- a/spec/core/integration/EnvSpec.js +++ b/spec/core/integration/EnvSpec.js @@ -1598,15 +1598,6 @@ describe('Env integration', function() { suiteFullNameToId[e.fullName] = e.id; }); - // Clone args to work around Jasmine mutating the result after passing it - // to the reporter event. - // TODO: remove this once Jasmine no longer does that - const clone = structuredClone.bind(globalThis); - reporter.specStarted.calls.saveArgumentsByValue(clone); - reporter.specDone.calls.saveArgumentsByValue(clone); - reporter.specStarted.calls.saveArgumentsByValue(clone); - reporter.suiteDone.calls.saveArgumentsByValue(clone); - env.configure({ random: false }); env.addReporter(reporter); diff --git a/src/core/ReportDispatcher.js b/src/core/ReportDispatcher.js index 266ed899..22f7255e 100644 --- a/src/core/ReportDispatcher.js +++ b/src/core/ReportDispatcher.js @@ -61,7 +61,7 @@ getJasmineRequireObj().ReportDispatcher = function(j$) { return; } - const thisEvent = j$.util.clone(event); + const thisEvent = structuredClone(event); if (fn.length <= 1) { fns.push({ fn: function() {