Skip to content

🚀 Feature: Replace canonical representations used in diffs with something like util.format() #4385

Open

Description

Prerequisites

  • Checked that your issue hasn't already been filed by cross-referencing issues with the faq label
  • Checked next-gen ES issues and syntax problems by using the same environment and/or transpiler configuration without Mocha to ensure it isn't just a feature that actually isn't supported in the environment in question or a bug in your code.
  • 'Smoke tested' the code to be tested by running it outside the real test suite to get a better sense of whether the problem is in the code under test, your usage of Mocha, or Mocha itself
  • Ensured that there is no discrepancy between the locally and globally installed versions of Mocha. You can find them with: node node_modules/.bin/mocha --version(Local) and mocha --version(Global). We recommend that you not install Mocha globally.

Description

Due to how mocha generates the diffs of action vs expected, the results can be very confusing and misleading. There's a big difference between an array that contains undefined and the value undefined — that is, [undefined] vs undefined.

I originally thought this was an issue in Chai, but it turns out to be in Mocha:

Steps to Reproduce

Given an assertion of:

expect({
  scopes: []
}).to.deep.equal({
  scopes: undefined
})

Expected behavior: [What you expect to happen]

Output should be:

  -  "scopes": []
  +  "scopes": undefined

Actual behavior: [What actually happens]

  -  "scopes": []
  +  "scopes": [undefined]

Reproduces how often: [What percentage of the time does it reproduce?]

Every time.

Versions

  • The output of mocha --version and node node_modules/.bin/mocha --version: 6.2.0, but the problem exists in v8.0.1 too
  • The output of node --version: 12.8.x
  • Your operating system
    • name and version: n/a
    • architecture (32 or 64-bit): n/a
  • Your shell (e.g., bash, zsh, PowerShell, cmd): n/a
  • Your browser and version (if running browser tests): n/a
  • Any third-party Mocha-related modules (and their versions): n/a
  • Any code transpiler (e.g., TypeScript, CoffeeScript, Babel) being used (and its version): n/a

Additional Information

This is due to Mocha's internal stringify function using square brackets to denote different types: https://github.com/mochajs/mocha/blob/v8.0.1/lib/utils.js#L303-L307

It looks okay when you're just doing a diff between undefined and something else, where the output will be:

- "something"
+ [undefined]

But because the stringify function is used recursively inside objects, it leads to confusing output.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    area: usabilityconcerning user experience or interfacesemver-majorimplementation requires increase of "major" version number; "breaking changes"status: accepting prsMocha can use your help with this one!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions