jest-shallow-serializer v1.0.0
jest-shallow-serializer
A flexible jest serializer for shallow rendering React components. Unlike full shallow renderers, this tool focuses on serializing only the components you pick, making snapshots cleaner and more focused. Perfect for targeted testing with minimal noise! 🚀
Motivation
I created this package because existing solutions for shallow rendering are no longer maintained, and the testing ecosystem seems to be shifting toward other approaches. However, I still believe shallow rendering is a valuable technique for isolating and testing components effectively, and this serializer aims to fill that gap.
Installation
- Install package
npm install jest-shallow-serializer --save-dev
- Add
jest-shallow-serializer
tocompilerOptions
types (intsconfig.json
):
"types": ["jest-shallow-serializer"]
- Add
jest-shallow-serializer
to snapshot serializers (injest.config
file):
"snapshotSerializers": ["jest-shallow-serializer/serializer"]
- Extend
global
scope (injest.config
file):
"setupFilesAfterEnv": ["<rootDir>/jest.setup.js"]
jest.setup.js
import { doShallow, shallowWrapper, shallowed } from "jest-shallow-serializer";
Object.assign(global, {
doShallow,
shallowWrapper,
shallowed,
});
- (Optional) You might need to add
doShallow
,shallowWrapper
andshallowed
as globals (ineslint.config
):
"globals": {
"doShallow": "readonly",
"shallowWrapper": "readonly",
"shallowed": "readonly"
},
Usage
Unlike enzyme#shallow
or react-test-renderer/shallow
, this library performs selective shallow rendering. Developers choose specific components to shallow render by mocking them. There are two ways to mock a component:
1. shallowWrapper
, shallowed
and jest.mock
import * as componentModule from "@/app/module/Component";
import { App } from "@/app/module/App";
jest.mock(
"@/app/module/Component",
shallowWrapper("@/app/module/Component", "ComponentName")
);
const shallowedComponentModule = shallowed(componentModule);
2. doShallow
+ require
doShallow
use jest.doMock
, which is not hoisted, that's why we need to require
shallowed module afterwards.
import { App } from "@/app/module/App";
const shallowedComponentModule = doShallow(
"@/app/module/Component",
"ComponentName"
);
const { ComponentName } = require("@/app/module/Component");
After obtaining shallowedComponentModule
, we can use it to mock
/ unmock
a component:
describe("Component", () => {
afterEach(() => {
shallowedComponentModule.unmock("ComponentName");
});
it("matches snapshot", () => {
shallowedComponentModule.mock("ComponentName");
const { asFragment } = render(<App />);
expect(asFragment()).toMatchSnapshot();
});
it("next test", () => {
render(<App />); // here `ComponentName` won't be shallowed
});
});
5 months ago