Jest: Using jest with node assert got wrong error type.

Created on 25 Dec 2018  路  6Comments  路  Source: facebook/jest

馃悰 Bug Report

The assert module in nodejs will throw error when assertion fail. It will throw a AssertionError If the second parameter is a string. But if the second parameter is an instance of Error, it will throw it instead of AssertionError.

I've tried this code and got the expected error.

const assert = require('assert');
const err = new Error('error message');

assert.ok(false, err);

But in my test case, i got an AssertionError.

To Reproduce

You may run this test case, it will fail:

const assert = require('assert');
const err = new Error('error message');

test('assert error object', () => {
  expect(() => {
    assert.ok(false, err);
  }).toThrow(err);
});

The failed error message is:

image

Expected behavior

Pass the test case. I know i could use something like .toThrow(err.message) to pass it, but i want to check the error type also.

Link to repl or repo (highly encouraged)

Just run the case above. :)

Run npx envinfo --preset jest

Paste the results here:

  System:
    OS: macOS 10.14.1
    CPU: (8) x64 Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz
  Binaries:
    Node: 11.5.0 - ~/.nvm/versions/node/v11.5.0/bin/node
    npm: 6.4.1 - ~/.nvm/versions/node/v11.5.0/bin/npm
  npmPackages:
    jest: ^23.6.0 => 23.6.0
Bug

Most helpful comment

I find it quite worrying that when I am running the code in the test environment it is being handled differently than it would in production. I should be able to rely on the fact my code will run the same in both environments otherwise the tests can't really be trusted.

All 6 comments

This is weird. Running the snippet above behaves differently in node and through jest.

I added try-catch just to make sure jest doesn't catch the error and format it.

const assert = require('assert');
const err = new Error('error message');

try {
  assert.ok(false, err);
} catch (e) {
  console.log(e.stack);
}

Jest:

    AssertionError [ERR_ASSERTION]: Error: error message
        at Object.ok (/Users/simen/Development/jest/weird.test.js:5:10)
        at Runtime._execModule (/Users/simen/Development/jest/packages/jest-runtime/build/index.js:709:13)
        at Runtime.requireModule (/Users/simen/Development/jest/packages/jest-runtime/build/index.js:354:14)
        at /Users/simen/Development/jest/packages/jest-jasmine2/build/index.js:199:13
        at Generator.next (<anonymous>)
        at asyncGeneratorStep (/Users/simen/Development/jest/packages/jest-jasmine2/build/index.js:27:24)
        at _next (/Users/simen/Development/jest/packages/jest-jasmine2/build/index.js:47:9)
        at /Users/simen/Development/jest/packages/jest-jasmine2/build/index.js:52:7
        at new Promise (<anonymous>)
        at /Users/simen/Development/jest/packages/jest-jasmine2/build/index.js:44:12

Node:

Error: error message
    at Object.<anonymous> (/Users/simen/Development/jest/weird.test.js:2:13)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
    at startup (internal/bootstrap/node.js:285:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)

@thymikee @rickhanlonii any ideas?

IIRC we re-throw Node assert errors with custom AssertionError: https://github.com/facebook/jest/blob/master/packages/jest-circus/src/formatNodeAssertErrors.js

Yeah, but that shouldn't happen when I catch it locally, unless we inject a fake assert module?

This is a use case for us to consider when deciding on a solution for #4724

For more info about the error class see: https://nodejs.org/dist/latest-v10.x/docs/api/assert.html#assert_class_assert_assertionerror

I confirm this behavior.

This is a burden in one of our use cases as we use assert for tasks unrelated to unit testing. Jest having unexpected side effect on the assert lib wherever it is used makes it unreliable as a unit testing framework in our case.

I find it quite worrying that when I am running the code in the test environment it is being handled differently than it would in production. I should be able to rely on the fact my code will run the same in both environments otherwise the tests can't really be trusted.

Was this page helpful?
0 / 5 - 0 ratings