Skip to content

Commit 7ee717d

Browse files
DiZySimenB
authored andcommitted
Fix pretty-format to respect displayName on forwardRef. (#9422)
Unlike React DevTools, Jest ignores a custom displayName set on forwardRef components. We should align serialization with DevTools, so change behavior.
1 parent abaea37 commit 7ee717d

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
- `[@jest/test-result]` Create method to create empty `TestResult` ([#8867](https://github.com/facebook/jest/pull/8867))
4343
- `[jest-worker]` [**BREAKING**] Return a promise from `end()`, resolving with the information whether workers exited gracefully ([#8206](https://github.com/facebook/jest/pull/8206))
4444
- `[jest-reporters]` Transform file paths into hyperlinks ([#8980](https://github.com/facebook/jest/pull/8980))
45+
- `[pretty-format]` Fix pretty-format to respect displayName on forwardRef ([#9422](https://github.com/facebook/jest/pull/9422))
4546

4647
### Fixes
4748

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
import React from 'react';
9+
import setPrettyPrint from './setPrettyPrint';
10+
import prettyFormat from '..';
11+
12+
const {ReactElement} = prettyFormat.plugins;
13+
14+
setPrettyPrint([ReactElement]);
15+
16+
describe('ReactElement Plugin', () => {
17+
let forwardRefComponent: {
18+
(_props: any, _ref: any): any;
19+
displayName?: string;
20+
};
21+
22+
let forwardRefExample: ReturnType<typeof React.forwardRef>;
23+
24+
beforeEach(() => {
25+
forwardRefComponent = (_props, _ref) => null;
26+
27+
forwardRefExample = React.forwardRef(forwardRefComponent);
28+
29+
forwardRefExample.displayName = undefined;
30+
});
31+
32+
test('serializes forwardRef without displayName', () => {
33+
forwardRefExample = React.forwardRef((_props, _ref) => null);
34+
expect(React.createElement(forwardRefExample)).toPrettyPrintTo(
35+
'<ForwardRef />',
36+
);
37+
});
38+
39+
test('serializes forwardRef with displayName', () => {
40+
forwardRefExample.displayName = 'Display';
41+
expect(React.createElement(forwardRefExample)).toPrettyPrintTo(
42+
'<Display />',
43+
);
44+
});
45+
46+
test('serializes forwardRef component with displayName', () => {
47+
forwardRefComponent.displayName = 'Display';
48+
expect(React.createElement(forwardRefExample)).toPrettyPrintTo(
49+
'<ForwardRef(Display) />',
50+
);
51+
});
52+
});

packages/pretty-format/src/plugins/ReactElement.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ const getType = (element: any) => {
5353
}
5454

5555
if (ReactIs.isForwardRef(element)) {
56+
if (type.displayName) {
57+
return type.displayName;
58+
}
59+
5660
const functionName = type.render.displayName || type.render.name || '';
5761

5862
return functionName !== ''

0 commit comments

Comments
 (0)