Browse Source

Add ReactTestRenderer documentations (#10692)

* Add ReactTestRenderer documentations

* Add TestRenderer documentations

* TestRenderer is not experiment

* Add a link for jsdom

* Use ES Modules syntax

* Twaek

* Add a Link component

* Use Jest assertions

* Move a documentation for createNodeMock to Idea section

* Renamed

* Tweak

* Rename

* More explicit

* Add a usecase for createNodeMock
main
Toru Kobayashi 7 years ago
committed by Andrew Clark
parent
commit
55b1848c3e
  1. 2
      _data/nav_docs.yml
  2. 283
      docs/reference-test-renderer.md

2
_data/nav_docs.yml

@ -75,3 +75,5 @@
title: Test Utilities
- id: shallow-renderer
title: Shallow Renderer
- id: test-renderer
title: Test Renderer

283
docs/reference-test-renderer.md

@ -0,0 +1,283 @@
---
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
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](http://facebook.github.io/jest/blog/2016/07/27/jest-14.html).
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.create()`](#TestRenderer.create)
### TestRenderer instance
* [`testRenderer.toJSON()`](#testRenderer.toJSON)
* [`testRenderer.toTree()`](#testRenderer.toTree)
* [`testRenderer.update()`](#testRenderer.update)
* [`testRenderer.unmount()`](#testRenderer.unmount)
* [`testRenderer.getInstance()`](#testRenderer.getInstance)
* [`testRenderer.root`](#testRenderer.root)
### TestInstance
* [`testInstance.find()`](#testInstance.find)
* [`testInstance.findByType()`](#testInstance.findByType)
* [`testInstance.findByProps()`](#testInstance.findByProps)
* [`testInstance.findAll()`](#testInstance.findAll)
* [`testInstance.findAllByType()`](#testInstance.findAllByType)
* [`testInstance.findAllByProps()`](#testInstance.findAllByProps)
* [`testInstance.instance`](#testInstance.instance)
* [`testInstance.type`](#testInstance.type)
* [`testInstance.props`](#testInstance.props)
* [`testInstance.parent`](#testInstance.parent)
* [`testInstance.children`](#testInstance.children)
## Reference
### `TestRenderer.create()`
```javascript
TestRenderer.create(element, options);
```
Create a TestRenderer instance with a passed element, which has the following methods and properties.
### `testRenderer.toJSON()`
```javascript
testRenderer.toJSON()
```
Return a JSON object representing the element.
### `testRenderer.toTree()`
```javascript
testRenderer.toTree()
```
Return a tree object representing the element.
### `testRenderer.update()`
```javascript
testRenderer.update(element)
```
Update the element with a passed element.
### `testRenderer.unmount()`
```javascript
testRenderer.unmount()
```
Unmount the element from testRenderer.
### `testRenderer.getInstance()`
```javascript
testRenderer.getInstance()
```
Return a root container instance.
### `testRenderer.root`
```javascript
testRenderer.root
```
`root` is a testInstance, which has the following methods and properties.
### `testInstance.find()`
```javascript
testInstance.find(test)
```
Find a descendant testInstance that `test(testInstance)` is `true`.
### `testInstance.findByType()`
```javascript
testInstance.findByType(type)
```
Find a descendant testInstance that matches the provided type.
### `testInstance.findByProps()`
```javascript
testInstance.findByProps(props)
```
Find a descendant testInstance that matches the provided props.
### `testInstance.findAll()`
```javascript
testInstance.findAll(test)
```
Find all descendant testInstances that `test(testInstance)` is `true`.
### `testInstance.findAllByType()`
```javascript
testInstance.findAllByType(type)
```
Find all descendant testInstances that matches the provided type.
### `testInstance.findAllByProps()`
```javascript
testInstance.findAllByProps(props)
```
Find all descendant testInstances that matches the provided props.
### `testInstance.instance`
```javascript
testInstance.instance
```
`instance` is a component instance of the testInstance.
### `testInstance.type`
```javascript
testInstance.type
```
`type` is a Component type of the testInstance.
### `testInstance.props`
```javascript
testInstance.props
```
`props` is a props object of the testInstance.
### `testInstance.parent`
```javascript
testInstance.parent
```
`parent` is a parent testInstance.
### `testInstance.children`
```javascript
testInstance.children
```
`children` is children of the testInstance.
## 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 rely 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);
```
Loading…
Cancel
Save