Skip to content

Commit

Permalink
feat: create no-conditional-expect rule
Browse files Browse the repository at this point in the history
  • Loading branch information
G-Rath committed Jun 21, 2020
1 parent 054cd24 commit aba53e4
Show file tree
Hide file tree
Showing 6 changed files with 600 additions and 1 deletion.
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -134,6 +134,7 @@ installations requiring long-term consistency.
| [lowercase-name](docs/rules/lowercase-name.md) | Enforce lowercase test names | | ![fixable][] |
| [no-alias-methods](docs/rules/no-alias-methods.md) | Disallow alias methods | ![style][] | ![fixable][] |
| [no-commented-out-tests](docs/rules/no-commented-out-tests.md) | Disallow commented out tests | ![recommended][] | |
| [no-conditional-expect](docs/rules/no-conditional-expect.md) | Prevent calling `expect` conditionally | | |
| [no-deprecated-functions](docs/rules/no-deprecated-functions.md) | Disallow use of deprecated functions | | ![fixable][] |
| [no-disabled-tests](docs/rules/no-disabled-tests.md) | Disallow disabled tests | ![recommended][] | |
| [no-duplicate-hooks](docs/rules/no-duplicate-hooks.md) | Disallow duplicate setup and teardown hooks | | |
Expand Down
70 changes: 70 additions & 0 deletions docs/rules/no-conditional-expect.md
@@ -0,0 +1,70 @@
# Prevent calling `expect` conditionally (`no-conditional-expect`)

This rule prevents the use of `expect` in conditional blocks, such as `if`s &
`catch`s.

## Rule Details

Jest considered a test to have failed if it throws an error, rather than on if
any particular function is called, meaning conditional calls to `expect` could
result in tests silently being skipped.

Additionally, conditionals tend to make tests more brittle and complex, as they
increase the amount of mental thinking needed to understand what is actually
being tested.

While `expect.assertions` & `expect.hasAssertions` can help prevent tests from
silently being skipped, when combined with conditionals they typically result in
even more complexity being introduced.

The following patterns are warnings:

```js
it('foo', () => {
doTest && expect(1).toBe(2);
});

it('bar', () => {
if (!skipTest) {
expect(1).toEqual(2);
}
});

it('baz', async () => {
try {
await foo();
} catch (err) {
expect(err).toMatchObject({ code: 'MODULE_NOT_FOUND' });
}
});
```

The following patterns are not warnings:

```js
it('foo', () => {
expect(!value).toBe(false);
});

function getValue() {
if (process.env.FAIL) {
return 1;
}

return 2;
}

it('foo', () => {
expect(getValue()).toBe(2);
});

it('validates the request', () => {
try {
processRequest(request);
} catch {
// ignore errors
} finally {
expect(validRequest).toHaveBeenCalledWith(request);
}
});
```
1 change: 1 addition & 0 deletions src/__tests__/__snapshots__/rules.test.ts.snap
Expand Up @@ -15,6 +15,7 @@ Object {
"jest/lowercase-name": "error",
"jest/no-alias-methods": "error",
"jest/no-commented-out-tests": "error",
"jest/no-conditional-expect": "error",
"jest/no-deprecated-functions": "error",
"jest/no-disabled-tests": "error",
"jest/no-duplicate-hooks": "error",
Expand Down
2 changes: 1 addition & 1 deletion src/__tests__/rules.test.ts
Expand Up @@ -3,7 +3,7 @@ import { resolve } from 'path';
import plugin from '../';

const ruleNames = Object.keys(plugin.rules);
const numberOfRules = 42;
const numberOfRules = 43;

describe('rules', () => {
it('should have a corresponding doc for each rule', () => {
Expand Down

0 comments on commit aba53e4

Please sign in to comment.