Skip to content

Commit d965592

Browse files
authored
feat: create prefer-mock-promise-shorthand rule (#1167)
1 parent 7a77bfd commit d965592

6 files changed

+564
-1
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ installations requiring long-term consistency.
232232
| [prefer-hooks-in-order](docs/rules/prefer-hooks-in-order.md) | Prefer having hooks in a consistent order | | |
233233
| [prefer-hooks-on-top](docs/rules/prefer-hooks-on-top.md) | Suggest having hooks before any test cases | | |
234234
| [prefer-lowercase-title](docs/rules/prefer-lowercase-title.md) | Enforce lowercase test names | | ![fixable][] |
235+
| [prefer-mock-promise-shorthand](docs/rules/prefer-mock-promise-shorthand.md) | Prefer mock resolved/rejected shorthands for promises | | ![fixable][] |
235236
| [prefer-snapshot-hint](docs/rules/prefer-snapshot-hint.md) | Prefer including a hint with external snapshots | | |
236237
| [prefer-spy-on](docs/rules/prefer-spy-on.md) | Suggest using `jest.spyOn()` | | ![fixable][] |
237238
| [prefer-strict-equal](docs/rules/prefer-strict-equal.md) | Suggest using `toStrictEqual()` | | ![suggest][] |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Prefer mock resolved/rejected shorthands for promises (`prefer-mock-promise-shorthand`)
2+
3+
When working with mocks of functions that return promises, Jest provides some
4+
API sugar functions to reduce the amount of boilerplate you have to write.
5+
6+
These methods should be preferred when possible.
7+
8+
## Rule Details
9+
10+
The following patterns are warnings:
11+
12+
```js
13+
jest.fn().mockImplementation(() => Promise.resolve(123));
14+
jest
15+
.spyOn(fs.promises, 'readFile')
16+
.mockReturnValue(Promise.reject(new Error('oh noes!')));
17+
18+
myFunction
19+
.mockReturnValueOnce(Promise.resolve(42))
20+
.mockImplementationOnce(() => Promise.resolve(42))
21+
.mockReturnValue(Promise.reject(new Error('too many calls!')));
22+
```
23+
24+
The following patterns are not warnings:
25+
26+
```js
27+
jest.fn().mockResolvedValue(123);
28+
jest.spyOn(fs.promises, 'readFile').mockRejectedValue(new Error('oh noes!'));
29+
30+
myFunction
31+
.mockResolvedValueOnce(42)
32+
.mockResolvedValueOnce(42)
33+
.mockRejectedValue(new Error('too many calls!'));
34+
```

src/__tests__/__snapshots__/rules.test.ts.snap

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Object {
4343
"jest/prefer-hooks-in-order": "error",
4444
"jest/prefer-hooks-on-top": "error",
4545
"jest/prefer-lowercase-title": "error",
46+
"jest/prefer-mock-promise-shorthand": "error",
4647
"jest/prefer-snapshot-hint": "error",
4748
"jest/prefer-spy-on": "error",
4849
"jest/prefer-strict-equal": "error",

src/__tests__/rules.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { existsSync } from 'fs';
22
import { resolve } from 'path';
33
import plugin from '../';
44

5-
const numberOfRules = 49;
5+
const numberOfRules = 50;
66
const ruleNames = Object.keys(plugin.rules);
77
const deprecatedRules = Object.entries(plugin.rules)
88
.filter(([, rule]) => rule.meta.deprecated)

0 commit comments

Comments
 (0)