Nx: Regression: Jest 26 spec tests - runner process never stops after test exception

Created on 26 Oct 2020  路  7Comments  路  Source: nrwl/nx

Current Behavior

Previously - before the update that introduced Jest 26 - missing dependency were outlined within the spec tests very nicely/clearly.

But now: Post - Jest 26 update:

1) After the test fails: The process never stop running - and you now have to force kill the tests.
2) We now get these "unclear" errors. I.e. errors provided have become very opaque. Example:

[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.
(node:28824) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Object'
    |     property 'element' -> object with constructor 'Object'
    |     property 'componentProvider' -> object with constructor 'Object'
    --- property 'parent' closes the circle

Expected Behavior

In the versions prior to Jest 26 - the error was much, much clearer - and pointed to the exact issue at hand:

NullInjectorError: StaticInjectorError(DynamicTestModule)[HttpClient]:
      StaticInjectorError(Platform: core)[HttpClient]:
        NullInjectorError: No provider for HttpClient!

I feel this is regression as we now - have to "guess" what is missing from the tests - this leads to a much worse DX :(

Steps to Reproduce

Create a simple service that has a simple dependency on something. Example: ensure your service has DI of: HttpClient in it.

Example:

export class NetflixService implements MovieProvider {
  constructor(private http: HttpClient) {

Inject this "new" service into your component.

Run your component spec test - without mocking out any of your dependency.

Failure Logs

(node:25892) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will termin
ate the Node.js process with a non-zero exit code.
(node:28824) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Object'
    |     property 'element' -> object with constructor 'Object'
    |     property 'componentProvider' -> object with constructor 'Object'
    --- property 'parent' closes the circle
    at stringify (<anonymous>)
    at writeChannelMessage (internal/child_process/serialization.js:117:20)
    at process.target._send (internal/child_process.js:779:17)
    at process.target.send (internal/child_process.js:677:19)
    at reportSuccess (C:\nrwl_10\node_modules\jest-runner\node_modules\jest-worker\build\workers\processChild.js:67:11)
(node:28824) 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(). To terminate the node process on unhandled promise rejection, use the CLI fla
g `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:28824) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will termin
ate the Node.js process with a non-zero exit code.

However - this should actually show me something like:

NullInjectorError: StaticInjectorError(DynamicTestModule)[HttpClient]:
      StaticInjectorError(Platform: core)[HttpClient]:
        NullInjectorError: No provider for HttpClient!

Environment

"dependencies": {
    "@angular/animations": "^10.1.3",
    "@angular/common": "^10.1.3",
    "@angular/compiler": "^10.1.3",
    "@angular/core": "^10.1.3",
    "@angular/forms": "^10.1.3",
    "@angular/platform-browser": "^10.1.3",
    "@angular/platform-browser-dynamic": "^10.1.3",
    "@angular/router": "^10.1.3",
    "@nrwl/angular": "10.3.1",
    "core-js": "^2.5.4",
    "rxjs": "~6.5.5",
    "tslib": "^2.0.0",
    "zone.js": "~0.10.2"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.1001.3",
    "@angular-devkit/build-ng-packagr": "~0.1001.3",
    "@angular/cli": "~10.1.3",
    "@angular/compiler-cli": "^10.1.3",
    "@angular/language-service": "^10.1.3",
    "@nrwl/cli": "10.3.1",
    "@nrwl/cypress": "10.3.1",
    "@nrwl/jest": "10.3.1",
    "@nrwl/workspace": "10.3.1",
    "@types/jest": "26.0.8",
    "@types/node": "^12.11.1",
    "codelyzer": "^5.1.2",
    "cypress": "4.12.1",
    "dotenv": "6.2.0",
    "jest": "26.2.2",
    "jest-preset-angular": "8.3.1",
    "ng-packagr": "^10.1.0",
    "prettier": "2.1.2",
    "ts-jest": "26.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~6.1.0",
    "typescript": "~4.0.3"
  }
testing tools bug

Most helpful comment

Agree with @ubergeoff

We are experiencing this same issue for a while in our project with 100+ libraries and it is really doing our lives a bit more miserable. Not just the real error is hidden, but also the tests will continue running forever, what leads to many builds hanging until the Jenkins job times out and gets killed.

All 7 comments

I can confirm that by adding --detectOpenHandles this will stop the test and display the correct error at hand (as described above).

Example: ng test some-lib --detectOpenHandles

However - this "extra" flag was not required before 10.3.0

@nrwl team: Please could you let us know your thoughts on this issue..? As this adds complications to the testing DX.

--detectOpenHandles is usable when debugging; however, it implies --runInBand and therefore has a huge performance impact.

@willydee - agreed - furthermore I'm just curious what the @nrwl team thinks about this "issue" - if they think it is a serious issue or not.

As I feel it is quite problematic - as testing is super critical to any organization.

Agree with @ubergeoff

We are experiencing this same issue for a while in our project with 100+ libraries and it is really doing our lives a bit more miserable. Not just the real error is hidden, but also the tests will continue running forever, what leads to many builds hanging until the Jenkins job times out and gets killed.

Hi there @FrozenPandaz - any thoughts on the above issues..?

I believe that's related to https://github.com/facebook/jest/issues/10577

@FrozenPandaz Related Jest issue has been closed, does it make sense to check and pin to the latest Jest?
If so, can it be done for both v10 and v11?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

elliotmendiola picture elliotmendiola  路  3Comments

jon301 picture jon301  路  3Comments

zpydee picture zpydee  路  3Comments

MichaelWarneke picture MichaelWarneke  路  3Comments

joelmuskwe picture joelmuskwe  路  3Comments