When an assertion fails where either the expected or actual value is circular, and both values are objects, jest encounters an error stating it failed to convert a circular structure to JSON, resulting in the test run not completing.
it("test", () => {
const foo = {};
foo.ref = foo;
expect(foo).toEqual({});
});
Running jest gives me the following error:
(node:11685) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
--- property 'ref' closes the circle
at stringify (<anonymous>)
at writeChannelMessage (internal/child_process/serialization.js:117:20)
at process.target._send (internal/child_process.js:804:17)
at process.target.send (internal/child_process.js:702:19)
at reportSuccess (/Users/verit/basic-jsx/node_modules/jest-worker/build/workers/processChild.js:67:11)
Jest continues running indefinitely (I only tested up to ten minutes) and reports nothing regarding the test suite.
I traced this to the added failureDetails property on error messages, landed in 26.3.0.
I'd expect the test to fail and jest to complete running.
I only tested two versions. The above error occurs on 14.9.0, but does not on 12.16.1.
System:
OS: macOS 10.15.6
CPU: (8) x64 Intel(R) Core(TM) i7-7920HQ CPU @ 3.10GHz
Binaries:
Node: 14.9.0 - ~/.nodenv/versions/14.9.0/bin/node
npm: 6.14.8 - ~/.nodenv/versions/14.9.0/bin/npm
npmPackages:
jest: ^26.4.2 => 26.4.2
Is there any workaround?
@Lonli-Lokli Looks like the only workaround for now is --detectOpenHandles
However, this causes a massive decrease in performance.
I hope this can be fixed soon. I have migrated several of our projects to jest... and now it causes hiccups all throughout our build system when one test breaks.
It would be nice if --testTimeout worked in this scenario... but it still allows the test to just hang until Jenkins or circle ci times out.
I can reproduce this when I have two such tests (in separate files - but not sure if this matters) and I have to run it with --watch. Here, however, it can be reproduced even without --watch: https://repl.it/@Frantiekiaik/jest-playground-1
I just ran into what I assume is the same issue on Node 10.16.0 and Jest 26.6.2. I can't reproduce it as written, but if I make a file containing two copies of @voces's example test and run it in watch mode, I get the same error.
The test:
it('test', () => {
const foo = {};
foo.ref = foo;
expect(foo).toEqual({});
});
it('test 2', () => {
const foo = {};
foo.ref = foo;
expect(foo).toEqual({});
});
The error:
(node:58951) ExperimentalWarning: The fs.promises API is experimental
(node:58951) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
at JSON.stringify (<anonymous>)
at process.target._send (internal/child_process.js:735:23)
at process.target.send (internal/child_process.js:634:19)
at reportSuccess (/Users/richardmunroe/analytics_ui/node_modules/jest-worker/build/workers/processChild.js:67:11)
(node:58951) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:58951) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Running with --detectOpenHandles makes the problem go away for me too.
This is happening since #9496
Commit 918636142791a3dd4ddfe9367149a90437bd6da9
And it seems to happen because of some inter-process serialization. After adding failureDetails property, the serialization fails on cyclic references as it contains the objects being under test. Maybe some sanitization of the failureDetails property would help.
Note that after commit 5f6f2ec8e17555b695d65ab68824926c77730216 which changes default runner to circus, the error message is
"messageParent" can only be used inside a worker
at messageParent (packages/jest-worker/build/workers/messageParent.js:46:11)
with JEST_JASMINE=1 the error is as before.
Added a PR as an attempt to fix this.
Also, please note that the messageParent error mentioned above is due to this line which swallows the real error message which is also about circular references.
Added a PR as an attempt to fix this.
馃帀
Also, please note that the
messageParenterror mentioned above is due to this line which swallows the real error message which is also about circular references.
We should not swallow errors like that...
Most helpful comment
@Lonli-Lokli Looks like the only workaround for now is
--detectOpenHandlesHowever, this causes a massive decrease in performance.
I hope this can be fixed soon. I have migrated several of our projects to jest... and now it causes hiccups all throughout our build system when one test breaks.
It would be nice if
--testTimeoutworked in this scenario... but it still allows the test to just hang until Jenkins or circle ci times out.