{"id":23440770,"url":"https://github.com/dabapps/react-shallow-renderer","last_synced_at":"2025-08-02T06:11:43.834Z","repository":{"id":34361601,"uuid":"175474611","full_name":"dabapps/react-shallow-renderer","owner":"dabapps","description":"A shallow renderer for React components","archived":false,"fork":false,"pushed_at":"2023-01-03T18:13:47.000Z","size":871,"stargazers_count":0,"open_issues_count":11,"forks_count":1,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-04-06T11:47:12.757Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dabapps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-13T18:11:05.000Z","updated_at":"2020-01-27T13:50:28.000Z","dependencies_parsed_at":"2023-01-15T06:34:11.422Z","dependency_job_id":null,"html_url":"https://github.com/dabapps/react-shallow-renderer","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dabapps%2Freact-shallow-renderer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dabapps%2Freact-shallow-renderer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dabapps%2Freact-shallow-renderer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dabapps%2Freact-shallow-renderer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dabapps","download_url":"https://codeload.github.com/dabapps/react-shallow-renderer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248108842,"owners_count":21049209,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-23T16:18:34.799Z","updated_at":"2025-04-09T20:37:29.248Z","avatar_url":"https://github.com/dabapps.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# react-shallow-renderer\n\n**A shallow renderer for React components**\n\n## About\n\nThis is a fork of [@jakesidsmith/react-shallow-renderer](https://github.com/jakesidsmith/react-shallow-renderer).\n\nThis is an alternative renderer to `react-test-renderer/shallow` with full support for:\n\n* React.memo\n* React.forwardRef\n* React.Fragment\n* React.createContext (Provider and Consumer)\n* ReactDOM.createPortal\n* Functional components\n* Component classes\n\nThe output of this renderer is far more informative than other existing renderers, providing context of memo wrapped components, fragments, etc.\n\n## Install\n\n```shell\nnpm i @dabapps/react-shallow-renderer -S\n```\n\n## Usage\n\nExample with jest:\n\n```jsx\nimport React from 'react';\nimport { ReactShallowRenderer } from '@dabapps/react-shallow-renderer';\nimport MyComponent from './path';\n\ndescribe('MyComponent', () =\u003e {\n  it('renders some stuff', () =\u003e {\n    const renderer = new ReactShallowRenderer(\u003cMyComponent /\u003e);\n\n    expect(renderer).toMatchSnapshot();\n  });\n});\n```\n\nNewer versions of jest will automatically call the `toJSON` method of the renderer. If the version you are using doesn't you can try:\n\n```jsx\nexpect(renderer.toJSON()).toMatchSnapshot();\n```\n\n## Example output in jest snapshots\n\n### A form component using `memo`, `Fragment`, a `SubmitButton` component that uses `memo`, and an external form library that uses `forwardRef`\n\n```jsx\nimport React from 'react';\nimport { Field } from 'form-library';\nimport SubmitButton from './path';\n\nconst MyComponent = (props) =\u003e (\n  \u003c\u003e\n    \u003ch1\u003e\n      Log in\n    \u003c/h1\u003e\n    \u003cform onSubmit={props.handleSubmit}\u003e\n      \u003cField component=\"input\" type=\"email\" name=\"email\"  /\u003e\n      \u003cField component=\"input\" type=\"password\" name=\"password\"  /\u003e\n      \u003cSubmitButton\u003e\n        Log in\n      \u003c/SubmitButton\u003e\n    \u003c/form\u003e\n    \u003ca href=\"/forgot-password\"\u003e\n      Forgot password?\n    \u003c/a\u003e\n  \u003c/\u003e\n);\n\nexport default React.memo(MyComponent);\n```\n\n### The output\n\n```html\n\u003cReact.Fragment\u003e\n  \u003ch1\u003e\n    Log in\n  \u003c/h1\u003e\n  \u003cform\n    onSubmit={[Function]}\n  \u003e\n    \u003cReact.forwardRef(Field)\n      component=\"input\"\n      type=\"email\"\n      name=\"email\"\n    /\u003e\n    \u003cReact.forwardRef(Field)\n      component=\"input\"\n      type=\"password\"\n      name=\"password\"\n    /\u003e\n    \u003cReact.memo(SubmitButton)\u003e\n      Log in\n    \u003c/React.memo(SubmitButton)\u003e\n  \u003c/form\u003e\n  \u003ca\n    href=\"/forgot-password\"\n  \u003e\n    Forgot password?\n  \u003c/a\u003e\n\u003c/React.Fragment\u003e\n```\n\n### A component using ReactDOM.createPortal, and a context consumer\n\n```jsx\nimport React, { PureComponent } from 'react';\nimport ReactDOM from 'react-dom';\nimport Popover from './path';\nimport { MyContext } from './another-path';\n\nexport default class MyComponent extends PureComponent {\n  render() {\n    return ReactDOM.createPortal(\n      (\n        \u003cPopover\u003e\n          \u003cMyContext.Consumer\u003e\n            {(value) =\u003e (\n              \u003cp\u003e\n                Some content: {value}\n              \u003c/p\u003e\n            )}\n          \u003c/MyContext.Consumer\u003e\n        \u003c/Popover\u003e\n      ),\n      document.getElementById('my-id')\n    );\n  }\n}\n```\n\n### The output\n\n```html\n\u003cReactDOM.Portal\u003e\n  \u003cPopover\u003e\n    \u003cReact.Consumer\u003e\n      [Function: Unknown]\n    \u003c/React.Consumer\u003e\n  \u003c/Popover\u003e\n\u003c/ReactDOM.Portal\u003e\n```\n\nYou can avoid the `Unknown` function here by defining a named function, or `const` outside of the render method, which should give you a nicer output, such as:\n\n```html\n\u003cReact.Consumer\u003e\n  [Function: myFunction]\n\u003c/React.Consumer\u003e\n```\n\n## Tips\n\nIn order to get better snapshots (and avoid unknown component names in dev tools), you should not define anonymous / arrow functions in your render method, or immediately inside wrappers like React.memo and React.forwardRef. Instead I recommend the following:\n\n```jsx\nconst MyComponent = () =\u003e \u003cdiv /\u003e;\n\nexport default React.memo(MyComponent);\n```\n\nOr with react-redux:\n\n```jsx\nconst MyComponent = () =\u003e \u003cdiv /\u003e;\n\nexport default connect(mapStateToProps)(React.memo(MyComponent));\n```\n\n## Updating this fork from upstream\n\nEnsure you have added a remote upstream in git e.g.\n\n```shell\ngit remote add upstream git@github.com:JakeSidSmith/react-shallow-renderer.git\n```\n\nCreate a new branch (from master) and run the following to pull changes from [upstream](https://github.com/jakesidsmith/react-shallow-renderer):\n\n```shell\ngit fetch upstream\ngit pull upstream master\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdabapps%2Freact-shallow-renderer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdabapps%2Freact-shallow-renderer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdabapps%2Freact-shallow-renderer/lists"}