Skip to content

Commit 3052bb6

Browse files
Added mockComponent util
1 parent 7afb787 commit 3052bb6

File tree

7 files changed

+117
-15
lines changed

7 files changed

+117
-15
lines changed

README.md

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,32 +24,36 @@ import React from "react";
2424
import TestRenderer from "react-test-renderer";
2525

2626
// 1. import
27-
import { assertComponents } from "react-assert";
27+
import { assertComponents, mockComponent } from "react-assert";
28+
29+
function SubComponent() {
30+
return <p className="sub">Sub</p>;
31+
}
32+
SubComponent.displayName = "SubComponent";
2833

2934
function MyComponent(props) {
35+
const { SubComp } = MyComponent;
36+
3037
return (
3138
<div>
32-
<SubComponent />
39+
<SubComp />
3340
<p className="my">{props.text}</p>
3441
</div>
3542
);
3643
}
3744
MyComponent.displayName = "MyComponent";
38-
39-
function SubComponent() {
40-
return <p className="sub">Sub</p>;
41-
}
45+
MyComponent.SubComp = SubComponent;
4246

4347
describe("MyComponent", () => {
44-
it("should render component", () => {
48+
it("should render nested components", () => {
4549
//given
4650
const text = "Hello";
4751

4852
//when
4953
const result = TestRenderer.create(<MyComponent text={text} />).root;
5054

5155
//then
52-
// 2. call it with result.children and expected components tree
56+
// 2. call assertComponents to check expected components tree
5357
assertComponents(
5458
result.children,
5559
<div>
@@ -58,5 +62,25 @@ describe("MyComponent", () => {
5862
</div>
5963
);
6064
});
65+
66+
it("should render mock components", () => {
67+
//given
68+
// 3. use mockComponent to mock nested components
69+
MyComponent.SubComp = mockComponent(SubComponent);
70+
const { SubComp } = MyComponent;
71+
const text = "Hello";
72+
73+
//when
74+
const result = TestRenderer.create(<MyComponent text={text} />).root;
75+
76+
//then
77+
assertComponents(
78+
result.children,
79+
<div>
80+
<SubComp />
81+
<p className="my">{text}</p>
82+
</div>
83+
);
84+
});
6185
});
6286
```

index.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@ export function assertComponents(
1010
results: (TestRenderer.ReactTestInstance | string)[],
1111
...expectedElements: (React.ReactElement | string)[]
1212
): void;
13+
14+
export function mockComponent<
15+
T = React.FunctionComponent<any> | React.ComponentClass<any>
16+
>(comp: T, name?: string): T;

index.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { default as assertComponent } from "./src/assertComponent.mjs";
22
export { default as assertComponents } from "./src/assertComponents.mjs";
3+
export { default as mockComponent } from "./src/mockComponent.mjs";

src/mockComponent.mjs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import React from "react";
2+
3+
/**
4+
* @template {React.FunctionComponent<any> | React.ComponentClass<any>} T
5+
* @param {T} comp
6+
* @param {string} [name]
7+
* @returns {T}
8+
*/
9+
function mockComponent(comp, name) {
10+
const mock = name || `${comp.displayName || ""}Mock`;
11+
// @ts-ignore
12+
return mock;
13+
}
14+
15+
export default mockComponent;

test/all.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
await import("./testRenderer.test.mjs");
22
await import("./assertComponent.test.mjs");
33
await import("./assertComponents.test.mjs");
4+
await import("./mockComponent.test.mjs");

test/example.jsx

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from "react";
22
import TestRenderer from "react-test-renderer";
3-
import { assertComponents } from "../index.mjs";
3+
import { assertComponents, mockComponent } from "../index.mjs";
44

55
const { describe, it } = await (async () => {
66
// @ts-ignore
@@ -9,23 +9,27 @@ const { describe, it } = await (async () => {
99
: import("node:test");
1010
})();
1111

12+
function SubComponent() {
13+
return <p className="sub">Sub</p>;
14+
}
15+
SubComponent.displayName = "SubComponent";
16+
1217
// @ts-ignore
1318
function MyComponent(props) {
19+
const { SubComp } = MyComponent;
20+
1421
return (
1522
<div>
16-
<SubComponent />
23+
<SubComp />
1724
<p className="my">{props.text}</p>
1825
</div>
1926
);
2027
}
2128
MyComponent.displayName = "MyComponent";
22-
23-
function SubComponent() {
24-
return <p className="sub">Sub</p>;
25-
}
29+
MyComponent.SubComp = SubComponent;
2630

2731
describe("MyComponent", () => {
28-
it("should render component", () => {
32+
it("should render nested components", () => {
2933
//given
3034
const text = "Hello";
3135

@@ -41,4 +45,23 @@ describe("MyComponent", () => {
4145
</div>
4246
);
4347
});
48+
49+
it("should render mock components", () => {
50+
//given
51+
MyComponent.SubComp = mockComponent(SubComponent);
52+
const { SubComp } = MyComponent;
53+
const text = "Hello";
54+
55+
//when
56+
const result = TestRenderer.create(<MyComponent text={text} />).root;
57+
58+
//then
59+
assertComponents(
60+
result.children,
61+
<div>
62+
<SubComp />
63+
<p className="my">{text}</p>
64+
</div>
65+
);
66+
});
4467
});

test/mockComponent.test.mjs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from "react";
2+
import assert from "node:assert/strict";
3+
import { mockComponent } from "../index.mjs";
4+
import { TestComp } from "./testComponents.mjs";
5+
6+
const { describe, it } = await (async () => {
7+
// @ts-ignore
8+
return process.isBun // @ts-ignore
9+
? Promise.resolve({ describe: (_, fn) => fn(), it: test })
10+
: import("node:test");
11+
})();
12+
13+
const h = React.createElement;
14+
15+
const Comp = () => {
16+
return h(React.Fragment, null, "test_text", h("div"), h(TestComp));
17+
};
18+
19+
describe("mockComponent.test.mjs", () => {
20+
it("should return generic Mock string", () => {
21+
//when & then
22+
assert.deepEqual(mockComponent(Comp), "Mock");
23+
});
24+
25+
it("should return provided name", () => {
26+
//when & then
27+
assert.deepEqual(mockComponent(Comp, "MyMock"), "MyMock");
28+
});
29+
30+
it("should return component's displayName + Mock", () => {
31+
//when & then
32+
assert.deepEqual(mockComponent(TestComp), "TestCompMock");
33+
});
34+
});

0 commit comments

Comments
 (0)