You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

315 lines
9.1 KiB

---
id: test-renderer
title: Test Renderer
permalink: docs/test-renderer.html
layout: docs
category: Reference
---
**Importing**
```javascript
import TestRenderer from 'react-test-renderer'; // ES6
const TestRenderer = require('react-test-renderer'); // ES5 with npm
```
## Overview {#overview}
This package provides a React renderer that can be used to render React components to pure JavaScript objects, without depending on the DOM or a native mobile environment.
Essentially, this package makes it easy to grab a snapshot of the platform view hierarchy (similar to a DOM tree) rendered by a React DOM or React Native component without using a browser or [jsdom](https://github.com/tmpvar/jsdom).
Example:
```javascript
import TestRenderer from 'react-test-renderer';
function Link(props) {
return <a href={props.page}>{props.children}</a>;
}
const testRenderer = TestRenderer.create(
<Link page="https://www.facebook.com/">Facebook</Link>
);
console.log(testRenderer.toJSON());
// { type: 'a',
// props: { href: 'https://www.facebook.com/' },
// children: [ 'Facebook' ] }
```
You can use Jest's snapshot testing feature to automatically save a copy of the JSON tree to a file and check in your tests that it hasn't changed: [Learn more about it](https://jestjs.io/docs/en/snapshot-testing).
You can also traverse the output to find specific nodes and make assertions about them.
```javascript
import TestRenderer from 'react-test-renderer';
function MyComponent() {
return (
<div>
<SubComponent foo="bar" />
<p className="my">Hello</p>
</div>
)
}
function SubComponent() {
return (
<p className="sub">Sub</p>
);
}
const testRenderer = TestRenderer.create(<MyComponent />);
const testInstance = testRenderer.root;
expect(testInstance.findByType(SubComponent).props.foo).toBe('bar');
expect(testInstance.findByProps({className: "sub"}).children).toEqual(['Sub']);
```
### TestRenderer {#testrenderer}
* [`TestRenderer.create()`](#testrenderercreate)
* [`TestRenderer.act()`](#testrendereract)
### TestRenderer instance {#testrenderer-instance}
* [`testRenderer.toJSON()`](#testrenderertojson)
* [`testRenderer.toTree()`](#testrenderertotree)
* [`testRenderer.update()`](#testrendererupdate)
* [`testRenderer.unmount()`](#testrendererunmount)
* [`testRenderer.getInstance()`](#testrenderergetinstance)
* [`testRenderer.root`](#testrendererroot)
### TestInstance {#testinstance}
* [`testInstance.find()`](#testinstancefind)
* [`testInstance.findByType()`](#testinstancefindbytype)
* [`testInstance.findByProps()`](#testinstancefindbyprops)
* [`testInstance.findAll()`](#testinstancefindall)
* [`testInstance.findAllByType()`](#testinstancefindallbytype)
* [`testInstance.findAllByProps()`](#testinstancefindallbyprops)
* [`testInstance.instance`](#testinstanceinstance)
* [`testInstance.type`](#testinstancetype)
* [`testInstance.props`](#testinstanceprops)
* [`testInstance.parent`](#testinstanceparent)
* [`testInstance.children`](#testinstancechildren)
## Reference {#reference}
### `TestRenderer.create()` {#testrenderercreate}
```javascript
TestRenderer.create(element, options);
```
Create a `TestRenderer` instance with the passed React element. It doesn't use the real DOM, but it still fully renders the component tree into memory so you can make assertions about it. Returns a [TestRenderer instance](#testrenderer-instance).
### `TestRenderer.act()` {#testrendereract}
```javascript
TestRenderer.act(callback);
```
Similar to the [`act()` helper from `react-dom/test-utils`](/docs/test-utils.html#act), `TestRenderer.act` prepares a component for assertions. Use this version of `act()` to wrap calls to `TestRenderer.create` and `testRenderer.update`.
```javascript
import {create, act} from 'react-test-renderer';
import App from './app.js'; // The component being tested
// render the component
let root;
act(() => {
root = create(<App value={1}/>)
});
// make assertions on root
expect(root.toJSON()).toMatchSnapshot();
// update with some different props
act(() => {
root.update(<App value={2}/>);
})
// make assertions on root
expect(root.toJSON()).toMatchSnapshot();
```
### `testRenderer.toJSON()` {#testrenderertojson}
```javascript
testRenderer.toJSON()
```
Return an object representing the rendered tree. This tree only contains the platform-specific nodes like `<div>` or `<View>` and their props, but doesn't contain any user-written components. This is handy for [snapshot testing](https://facebook.github.io/jest/docs/en/snapshot-testing.html#snapshot-testing-with-jest).
### `testRenderer.toTree()` {#testrenderertotree}
```javascript
testRenderer.toTree()
```
Return an object representing the rendered tree. The representation is more detailed than the one provided by `toJSON()`, and includes the user-written components. You probably don't need this method unless you're writing your own assertion library on top of the test renderer.
### `testRenderer.update()` {#testrendererupdate}
```javascript
testRenderer.update(element)
```
Re-render the in-memory tree with a new root element. This simulates a React update at the root. If the new element has the same type and key as the previous element, the tree will be updated; otherwise, it will re-mount a new tree.
### `testRenderer.unmount()` {#testrendererunmount}
```javascript
testRenderer.unmount()
```
Unmount the in-memory tree, triggering the appropriate lifecycle events.
### `testRenderer.getInstance()` {#testrenderergetinstance}
```javascript
testRenderer.getInstance()
```
Return the instance corresponding to the root element, if available. This will not work if the root element is a function component because they don't have instances.
### `testRenderer.root` {#testrendererroot}
```javascript
testRenderer.root
```
Returns the root "test instance" object that is useful for making assertions about specific nodes in the tree. You can use it to find other "test instances" deeper below.
### `testInstance.find()` {#testinstancefind}
```javascript
testInstance.find(test)
```
Find a single descendant test instance for which `test(testInstance)` returns `true`. If `test(testInstance)` does not return `true` for exactly one test instance, it will throw an error.
### `testInstance.findByType()` {#testinstancefindbytype}
```javascript
testInstance.findByType(type)
```
Find a single descendant test instance with the provided `type`. If there is not exactly one test instance with the provided `type`, it will throw an error.
### `testInstance.findByProps()` {#testinstancefindbyprops}
```javascript
testInstance.findByProps(props)
```
Find a single descendant test instance with the provided `props`. If there is not exactly one test instance with the provided `props`, it will throw an error.
### `testInstance.findAll()` {#testinstancefindall}
```javascript
testInstance.findAll(test)
```
Find all descendant test instances for which `test(testInstance)` returns `true`.
### `testInstance.findAllByType()` {#testinstancefindallbytype}
```javascript
testInstance.findAllByType(type)
```
Find all descendant test instances with the provided `type`.
### `testInstance.findAllByProps()` {#testinstancefindallbyprops}
```javascript
testInstance.findAllByProps(props)
```
Find all descendant test instances with the provided `props`.
### `testInstance.instance` {#testinstanceinstance}
```javascript
testInstance.instance
```
The component instance corresponding to this test instance. It is only available for class components, as function components don't have instances. It matches the `this` value inside the given component.
### `testInstance.type` {#testinstancetype}
```javascript
testInstance.type
```
The component type corresponding to this test instance. For example, a `<Button />` component has a type of `Button`.
### `testInstance.props` {#testinstanceprops}
```javascript
testInstance.props
```
The props corresponding to this test instance. For example, a `<Button size="small" />` component has `{size: 'small'}` as props.
### `testInstance.parent` {#testinstanceparent}
```javascript
testInstance.parent
```
The parent test instance of this test instance.
### `testInstance.children` {#testinstancechildren}
```javascript
testInstance.children
```
The children test instances of this test instance.
## Ideas {#ideas}
You can pass `createNodeMock` function to `TestRenderer.create` as the option, which allows for custom mock refs.
`createNodeMock` accepts the current element and should return a mock ref object.
This is useful when you test a component that relies on refs.
```javascript
import TestRenderer from 'react-test-renderer';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.input = null;
}
componentDidMount() {
this.input.focus();
}
render() {
return <input type="text" ref={el => this.input = el} />
}
}
let focused = false;
TestRenderer.create(
<MyComponent />,
{
createNodeMock: (element) => {
if (element.type === 'input') {
// mock a focus function
return {
focus: () => {
focused = true;
}
};
}
return null;
}
}
);
expect(focused).toBe(true);
```