Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add error throwing to 'it'/'test' for incorrect arguments. #5558

Merged
merged 103 commits into from Feb 26, 2018

Conversation

brianlmacdonald
Copy link
Contributor

@brianlmacdonald brianlmacdonald commented Feb 14, 2018

Summary

Addresses #5493. Previously, missing or invalid arguments in 'it' and 'test' would cause the tests to be skipped. This PR adds error throwing in both jest-jasmine2 and jest-circus, ensuring that when passing arguments:

  • The first argument is a string.
  • There is a second argument.
  • That the second argument is a function.

Test plan

const {sum} = require('./sums.js')
//correct
it('adds', ()  => {
  expect(sum(2, 3)).toBe(5)
})
//incorrect
// first argument must be a string!
it(() => {
  expect(sum(2, 3,)).toBe(5)
})
//missing second argument!
it('adds')
//second argument must be a function!
it('adds', 'not a function')

I linked the development build of the feature branch to another project and ran tests there to make sure it passed external tests, as well as the internal tests.

screen shot 2018-02-13 at 10 15 18 am

It works correctly with valid arguments.

screen shot 2018-02-13 at 10 20 08 am

screen shot 2018-02-13 at 10 16 27 am

screen shot 2018-02-13 at 10 15 54 am

It throws these magnificent errors with invalid arguments.

For the internal tests, jest-jasmine2, would throw an error for the correct use cases, because of its rule about nested tests. Go figure, testing tests is tricky.

I test jest-circus's 'it' with jest-jasmine2's 'it'. I needed to differentiate between the two methods, but since the jest-circus methods are module.exports I couldn't use imports' 'as' keyword to alias jest-circus's 'it', so i made an alias maker function, requiring in jest-circus's it and renaming it circusIt.

Also, had to add jest-circus's test file to the flowconfig ignore otherwise it wouldn't allow for invalid arguments. Flow, you are too good sometimes!

Note: the /integration-tests/tests/globals.test.js has two tests expecting an unimplemented test/it to return a status 0, which it can't anymore because of the nature of this feature. To get this up to speed I changed the names of these tests to start with "cannot test...", changed the expected status to 1, and since part of these tests requires the ``rest` snapshot, which lists the absolute path to the file starting with the root of my computer, I cleaned up the path in Utils, removing the non-universal parts of the path.

@codecov-io
Copy link

codecov-io commented Feb 14, 2018

Codecov Report

Merging #5558 into master will increase coverage by 0.8%.
The diff coverage is 62.5%.

Impacted file tree graph

@@            Coverage Diff            @@
##           master    #5558     +/-   ##
=========================================
+ Coverage   62.35%   63.15%   +0.8%     
=========================================
  Files         216      216             
  Lines        7908     7912      +4     
  Branches        4        3      -1     
=========================================
+ Hits         4931     4997     +66     
+ Misses       2976     2914     -62     
  Partials        1        1
Impacted Files Coverage Δ
packages/jest-jasmine2/src/jasmine/Env.js 0% <0%> (ø) ⬆️
packages/jest-message-util/src/index.js 81.1% <100%> (ø) ⬆️
packages/jest-circus/src/index.js 70% <100%> (+70%) ⬆️
...kages/jest-circus/src/format_node_assert_errors.js 19.44% <0%> (+19.44%) ⬆️
packages/jest-circus/src/utils.js 19.76% <0%> (+19.76%) ⬆️
packages/jest-circus/src/event_handler.js 23.07% <0%> (+23.07%) ⬆️
packages/jest-circus/src/state.js 92.3% <0%> (+92.3%) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 196d9b8...f3f1213. Read the comment docs.

SimenB
SimenB previously requested changes Feb 14, 2018
`Invalid first argument, ${testName}. It must be a string.`,
);
}
if (fn === undefined) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is legal to not pass second argument, I use it as test placeholders.

Might be a a good idea to have an explicit test.todo for that case, though

`Invalid first argument, ${description}. It must be a string.`,
);
}
if (fn === undefined) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, cool. So to clarify: add an it.todo and test.todo to ignore cases like

test.todo('justOneArgument')

but still throw the error for test('justOneArgument')?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think "yes", but it's too breaking. But I think we should do it for the next version.

(I'm all for adding test/it.todo now - though probably in a separate PR)

@cpojer thoughts?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure about test.todo, let's discuss that separately. I'm definitely on board with making test/it with one argument throw. I do not consider it a breaking change but rather a bug fix, so it's fine to go into a minor.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fair enough 🙂


const {summary, rest} = extractSummary(stderr);
expect(rest).toMatchSnapshot();
// expect(rest).toMatchSnapshot();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are these commented out?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this PR is pretty good to go other than that 🙂

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, great. Let me make those changes and I'll push it up.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@SimenB , that snapshot was commented out because it listed the absolute path to the file on my computer, which won't match when the CI is run. Any ideas on how to hide the path?
screen shot 2018-02-14 at 4 21 35 pm

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your path is messed up - it's a relative path to an absolute one...


const {summary, rest} = extractSummary(stderr);
expect(rest).toMatchSnapshot();
const restWithoutStack = rest.slice(0, 343);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Heh, seems somewhat arbitrary.

We should probably clean the stack up better instead of adding this hack

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should I use formatStackTrace from jest-message-utils when creating the error?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, it's called automatically.

As it's only an issue for the integration tests (as they used linked files instead of inside node_module), I think we should be good with just stripping that single line in https://github.com/facebook/jest/blob/d065e87a2322e1b4b70e7ba9de3c24aed7a2ea72/integration-tests/Utils.js#L162

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@SimenB I'm struggling with this one bit. cleanupStackTrace doesn't replace the stacktrace for the Env, but does for everything else.


431 | }
432 | if (fn === undefined) {
> 433 | throw new Error(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ugh, any way we can disable code frame for this one, @SimenB?

Copy link
Member

@SimenB SimenB Feb 16, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It points to the it in real code, not sure why it shows the throw here..

image

image

image

image

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the frame is probably unable to find __tests__/only-constructs.test.js for whatever reason - I'd debug that

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I’ll look in it. Thanks!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was pulling in the wrong frame because In jest-message-util

  for (const line of lines) {
    if (
      line.includes(PATH_NODE_MODULES) ||
      line.includes(PATH_EXPECT_BUILD)
    ) {
      continue;
    }

Wouldn't catch if the the top frame was from jest packages, so I added a condition:

const PATH_JEST_PACKAGES = `${path.sep}jest${path.sep}packages${path.sep}`;

that way it ignores the jest code as the topframe.

@thymikee thymikee mentioned this pull request May 29, 2018
calebeby pushed a commit to Pigmice2733/scouting-frontend that referenced this pull request May 30, 2018
This Pull Request updates dependency [jest](https://github.com/facebook/jest) from `v22.4.3` to `v23.0.1`



<details>
<summary>Release Notes</summary>

### [`v23.0.1`](https://github.com/facebook/jest/blob/master/CHANGELOG.md#&#8203;2301)
[Compare Source](jestjs/jest@v23.0.0...3a3b4e3)
##### Chore & Maintenance

* `[jest-jasemine2]` Add dependency on jest-each ([#&#8203;6308](`jestjs/jest#6308))
* `[jest-each]` Move jest-each into core Jest ([#&#8203;6278](`jestjs/jest#6278))
* `[examples]` Update typescript example to using ts-jest ([#&#8203;6260](`jestjs/jest#6260))
##### Fixes

* `[pretty-format]` Serialize inverse asymmetric matchers correctly ([#&#8203;6272](`jestjs/jest#6272))

---

### [`v23.0.0`](https://github.com/facebook/jest/blob/master/CHANGELOG.md#&#8203;2300)
[Compare Source](jestjs/jest@2745e3e...v23.0.0)
##### Features

* `[expect]` Expose `getObjectSubset`, `iterableEquality`, and `subsetEquality` ([#&#8203;6210](`jestjs/jest#6210))
* `[jest-snapshot]` Add snapshot property matchers ([#&#8203;6210](`jestjs/jest#6210))
* `[jest-config]` Support jest-preset.js files within Node modules ([#&#8203;6185](`jestjs/jest#6185))
* `[jest-cli]` Add `--detectOpenHandles` flag which enables Jest to potentially track down handles keeping it open after tests are complete. ([#&#8203;6130](`jestjs/jest#6130))
* `[jest-jasmine2]` Add data driven testing based on `jest-each` ([#&#8203;6102](`jestjs/jest#6102))
* `[jest-matcher-utils]` Change "suggest to equal" message to be more advisory ([#&#8203;6103](`jestjs/jest#6103))
* `[jest-message-util]` Don't ignore messages with `vendor` anymore ([#&#8203;6117](`jestjs/jest#6117))
* `[jest-validate]` Get rid of `jest-config` dependency ([#&#8203;6067](`jestjs/jest#6067))
* `[jest-validate]` Adds option to inject `deprecationEntries` ([#&#8203;6067](`jestjs/jest#6067))
* `[jest-snapshot]` [**BREAKING**] Concatenate name of test, optional snapshot name and count ([#&#8203;6015](`jestjs/jest#6015))
* `[jest-runtime]` Allow for transform plugins to skip the definition process method if createTransformer method was defined. ([#&#8203;5999](`jestjs/jest#5999))
* `[expect]` Add stack trace for async errors ([#&#8203;6008](`jestjs/jest#6008))
* `[jest-jasmine2]` Add stack trace for timeouts ([#&#8203;6008](`jestjs/jest#6008))
* `[jest-jasmine2]` Add stack trace for thrown non-`Error`s ([#&#8203;6008](`jestjs/jest#6008))
* `[jest-runtime]` Prevent modules from marking themselves as their own parent ([#&#8203;5235](`jestjs/jest#5235))
* `[jest-mock]` Add support for auto-mocking generator functions ([#&#8203;5983](`jestjs/jest#5983))
* `[expect]` Add support for async matchers  ([#&#8203;5919](`jestjs/jest#5919))
* `[expect]` Suggest toContainEqual ([#&#8203;5948](`jestjs/jest#5953))
* `[jest-config]` Export Jest's default options ([#&#8203;5948](`jestjs/jest#5948))
* `[jest-editor-support]` Move `coverage` to `ProjectWorkspace.collectCoverage` ([#&#8203;5929](`jestjs/jest#5929))
* `[jest-editor-support]` Add `coverage` option to runner ([#&#8203;5836](`jestjs/jest#5836))
* `[jest-haste-map]` Support extracting dynamic `import`s ([#&#8203;5883](`jestjs/jest#5883))
* `[expect]` Improve output format for mismatchedArgs in mock/spy calls. ([#&#8203;5846](`jestjs/jest#5846))
* `[jest-cli]` Add support for using `--coverage` in combination with watch mode, `--onlyChanged`, `--findRelatedTests` and more ([#&#8203;5601](`jestjs/jest#5601))
* `[jest-jasmine2]` [**BREAKING**] Adds error throwing and descriptive errors to `it`/ `test` for invalid arguments. `[jest-circus]` Adds error throwing and descriptive errors to `it`/ `test` for invalid arguments ([#&#8203;5558](`jestjs/jest#5558))
* `[jest-matcher-utils]` Add `isNot` option to `matcherHint` function ([#&#8203;5512](`jestjs/jest#5512))
* `[jest-config]` Add `<rootDir>` to runtime files not found error report ([#&#8203;5693](`jestjs/jest#5693))
* `[expect]` Make toThrow matcher pass only if Error object is returned from promises ([#&#8203;5670](`jestjs/jest#5670))
* `[expect]` Add isError to utils ([#&#8203;5670](`jestjs/jest#5670))
* `[expect]` Add inverse matchers (`expect.not.arrayContaining`, etc., [#&#8203;5517](`jestjs/jest#5517))
* `[expect]` `expect.extend` now also extends asymmetric matchers ([#&#8203;5503](`jestjs/jest#5503))
* `[jest-mock]` Update `spyOnProperty` to support spying on the prototype chain ([#&#8203;5753](`jestjs/jest#5753))
* `[jest-mock]` Add tracking of return values in the `mock` property ([#&#8203;5752](`jestjs/jest#5752))
* `[jest-mock]` Add tracking of thrown errors in the `mock` property ([#&#8203;5764](`jestjs/jest#5764))
* `[expect]`Add nthCalledWith spy matcher ([#&#8203;5605](`jestjs/jest#5605))
* `[jest-cli]` Add `isSerial` property that runners can expose to specify that they can not run in parallel ([#&#8203;5706](`jestjs/jest#5706))
* `[expect]` Add `.toBeCalledTimes` and `toHaveBeenNthCalledWith` aliases ([#&#8203;5826](`jestjs/jest#5826))
* `[jest-cli]` Interactive Snapshot Mode improvements ([#&#8203;5864](`jestjs/jest#5864))
* `[jest-editor-support]` Add `no-color` option to runner ([#&#8203;5909](`jestjs/jest#5909))
* `[jest-jasmine2]` Pretty-print non-Error object errors ([#&#8203;5980](`jestjs/jest#5980))
* `[jest-message-util]` Include column in stack frames ([#&#8203;5889](`jestjs/jest#5889))
* `[expect]` Introduce toStrictEqual ([#&#8203;6032](`jestjs/jest#6032))
* `[expect]` Add return matchers ([#&#8203;5879](`jestjs/jest#5879))
* `[jest-cli]` Improve snapshot summaries ([#&#8203;6181](`jestjs/jest#6181))
* `[expect]` Include custom mock names in error messages ([#&#8203;6199](`jestjs/jest#6199))
* `[jest-diff]` Support returning diff from oneline strings ([#&#8203;6221](`jestjs/jest#6221))
* `[expect]` Improve return matchers ([#&#8203;6172](`jestjs/jest#6172))
* `[jest-cli]` Overhaul watch plugin hooks names ([#&#8203;6249](`jestjs/jest#6249))
* `[jest-mock]` Include tracked call results in serialized mock ([#&#8203;6244](`jestjs/jest#6244))
##### Fixes

* `[jest-cli]` Fix stdin encoding to utf8 for watch plugins. ([#&#8203;6253](`jestjs/jest#6253))
* `[expect]` Better detection of DOM Nodes for equality ([#&#8203;6246](`jestjs/jest#6246))
* `[jest-cli]` Fix misleading action description for F key when in "only failed tests" mode. ([#&#8203;6167](`jestjs/jest#6167))
* `[jest-worker]` Stick calls to workers before processing them ([#&#8203;6073](`jestjs/jest#6073))
* `[babel-plugin-jest-hoist]` Allow using `console` global variable ([#&#8203;6075](`jestjs/jest#6075))
* `[jest-jasmine2]` Always remove node core message from assert stack traces ([#&#8203;6055](`jestjs/jest#6055))
* `[expect]` Add stack trace when `expect.assertions` and `expect.hasAssertions` causes test failures. ([#&#8203;5997](`jestjs/jest#5997))
* `[jest-runtime]` Throw a more useful error when trying to require modules after the test environment is torn down ([#&#8203;5888](`jestjs/jest#5888))
* `[jest-mock]` [**BREAKING**] Replace timestamps with `invocationCallOrder` ([#&#8203;5867](`jestjs/jest#5867))
* `[jest-jasmine2]` Install `sourcemap-support` into normal runtime to catch runtime errors ([#&#8203;5945](`jestjs/jest#5945))
* `[jest-jasmine2]` Added assertion error handling inside `afterAll hook` ([#&#8203;5884](`jestjs/jest#5884))
* `[jest-cli]` Remove the notifier actions in case of failure when not in watch mode. ([#&#8203;5861](`jestjs/jest#5861))
* `[jest-mock]` Extend .toHaveBeenCalled return message with outcome ([#&#8203;5951](`jestjs/jest#5951))
* `[jest-runner]` Assign `process.env.JEST_WORKER_ID="1"` when in runInBand mode ([#&#8203;5860](`jestjs/jest#5860))
* `[jest-cli]` Add descriptive error message when trying to use `globalSetup`/`globalTeardown` file that doesn't export a function. ([#&#8203;5835](`jestjs/jest#5835))
* `[expect]` Do not rely on `instanceof RegExp`, since it will not work for RegExps created inside of a different VM ([#&#8203;5729](`jestjs/jest#5729))
* `[jest-resolve]` Update node module resolution algorithm to correctly handle symlinked paths ([#&#8203;5085](`jestjs/jest#5085))
* `[jest-editor-support]` Update `Settings` to use spawn in shell option ([#&#8203;5658](`jestjs/jest#5658))
* `[jest-cli]` Improve the error message when 2 projects resolve to the same config ([#&#8203;5674](`jestjs/jest#5674))
* `[jest-runtime]` remove retainLines from coverage instrumentation ([#&#8203;5692](`jestjs/jest#5692))
* `[jest-cli]` Fix update snapshot issue when using watchAll ([#&#8203;5696](`jestjs/jest#5696))
* `[expect]` Fix rejects.not matcher ([#&#8203;5670](`jestjs/jest#5670))
* `[jest-runtime]` Prevent Babel warnings on large files ([#&#8203;5702](`jestjs/jest#5702))
* `[jest-mock]` Prevent `mockRejectedValue` from causing unhandled rejection ([#&#8203;5720](`jestjs/jest#5720))
* `[pretty-format]` Handle React fragments better ([#&#8203;5816](`jestjs/jest#5816))
* `[pretty-format]` Handle formatting of `React.forwardRef` and `Context` components ([#&#8203;6093](`jestjs/jest#6093))
* `[jest-cli]` Switch collectCoverageFrom back to a string ([#&#8203;5914](`jestjs/jest#5914))
* `[jest-regex-util]` Fix handling regex symbols in tests path on Windows ([#&#8203;5941](`jestjs/jest#5941))
* `[jest-util]` Fix handling of NaN/Infinity in mock timer delay ([#&#8203;5966](`jestjs/jest#5966))
* `[jest-resolve]` Generalise test for package main entries equivalent to ".". ([#&#8203;5968](`jestjs/jest#5968))
* `[jest-config]` Ensure that custom resolvers are used when resolving the configuration ([#&#8203;5976](`jestjs/jest#5976))
* `[website]` Fix website docs ([#&#8203;5853](`jestjs/jest#5853))
* `[expect]` Fix isEqual Set and Map to compare object values and keys regardless of order ([#&#8203;6150](`jestjs/jest#6150))
* `[pretty-format]` [**BREAKING**] Remove undefined props from React elements ([#&#8203;6162](`jestjs/jest#6162))
* `[jest-haste-map]` Properly resolve mocked node modules without package.json defined ([#&#8203;6232](`jestjs/jest#6232))
##### Chore & Maintenance

* `[jest-runner]` Move sourcemap installation from `jest-jasmine2` to `jest-runner` ([#&#8203;6176](`jestjs/jest#6176))
* `[jest-cli]` Use yargs's built-in `version` instead of rolling our own ([#&#8203;6215](`jestjs/jest#6215))
* `[docs]` Add explanation on how to mock methods not implemented in JSDOM
* `[jest-jasmine2]` Simplify `Env.execute` and TreeProcessor to setup and clean resources for the top suite the same way as for all of the children suites ([#&#8203;5885](`jestjs/jest#5885))
* `[babel-jest]` [**BREAKING**] Always return object from transformer ([#&#8203;5991](`jestjs/jest#5991))
* `[*]` Run Prettier on compiled output ([#&#8203;5858](`jestjs/jest#3497))
* `[jest-cli]` Add fileChange hook for plugins ([#&#8203;5708](`jestjs/jest#5708))
* `[docs]` Add docs on using `jest.mock(...)` ([#&#8203;5648](`jestjs/jest#5648))
* `[docs]` Mention Jest Puppeteer Preset ([#&#8203;5722](`jestjs/jest#5722))
* `[docs]` Add jest-community section to website ([#&#8203;5675](`jestjs/jest#5675))
* `[docs]` Add versioned docs for v22.4 ([#&#8203;5733](`jestjs/jest#5733))
* `[docs]` Improve Snapshot Testing Guide ([#&#8203;5812](`jestjs/jest#5812))
* `[jest-runtime]` [**BREAKING**] Remove `jest.genMockFn` and `jest.genMockFunction` ([#&#8203;6173](`jestjs/jest#6173))
* `[jest-message-util]` Avoid adding unnecessary indent to blank lines in stack traces ([#&#8203;6211](`jestjs/jest#6211))

---

### [`v22.4.4`](jestjs/jest@6851d8b...v22.4.4)
[Compare Source](jestjs/jest@6851d8b...v22.4.4)


---

</details>




---

This PR has been generated by [Renovate Bot](https://renovatebot.com).
@shellscape
Copy link

Did anyone realize that this broke the intent behind #1775? Even test.skip now produces this error. It seems awfully needless that an intentionally skipped test (as there doesn't appear to be a test.todo equivalent) requires a noop function to pass validation.

@elyobo
Copy link

elyobo commented Jun 13, 2018

@evocateur yeah, it should really be called out as breaking in the changelog. Just updated it: 02f4166

Why not implement it in a non-breaking way instead? #5493 doesn't require checking the second argument, only the first.

pk-nb added a commit to pk-nb/jest that referenced this pull request Jul 2, 2018
- Continues to validate arguments to avoid accidental skips from jestjs#5558
pk-nb added a commit to pk-nb/jest that referenced this pull request Jul 2, 2018
- Continues to validate arguments to avoid accidental skips from jestjs#5558
pk-nb added a commit to pk-nb/jest that referenced this pull request Jul 2, 2018
- Continues to validate arguments to avoid accidental skips from jestjs#5558
pk-nb added a commit to pk-nb/jest that referenced this pull request Jul 12, 2018
- Continues to validate arguments to avoid accidental skips from jestjs#5558
hzoo pushed a commit to babel/babel that referenced this pull request Jul 19, 2018
@github-actions
Copy link

This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.
Please note this issue tracker is not a help forum. We recommend using StackOverflow or our discord channel for questions.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators May 12, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

9 participants