Test Renderer
Importing
import TestRenderer from 'react-test-renderer'; // ES6
const TestRenderer = require('react-test-renderer'); // ES5 với npm
Sơ lược
Gói này cung cấp một React Renderer để sử dụng cho việc render những React component thành những Javascript object, mà không cần dựa trên DOM hay một môi trường native mobile nào.
Về bản chất, gói này giúp cho việc chụp một bức tranh toàn cảnh của cấu trúc view (tương tự như cây DOM) được render bởi một component React DOM hay React Native mà không cần tới một trình duyệt hay jsdom.
Ví dụ:
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' ] }
Bạn có thể sử dụng chức năng chụp snapshot của Jest để tự động lưu một bản sao của cây JSON vào 1 tập tin và kiểm tra trong những bản thử của bạn rằng nó không thay đổi: Xem thêm về nó.
Bạn cũng có thể đi qua đầu ra để tìm những node nhất định và kiểm tra độ chính xác của chúng.
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 instance
testRenderer.toJSON()
testRenderer.toTree()
testRenderer.update()
testRenderer.unmount()
testRenderer.getInstance()
testRenderer.root
TestInstance
testInstance.find()
testInstance.findByType()
testInstance.findByProps()
testInstance.findAll()
testInstance.findAllByType()
testInstance.findAllByProps()
testInstance.instance
testInstance.type
testInstance.props
testInstance.parent
testInstance.children
Tài liệu tham khảo
TestRenderer.create()
TestRenderer.create(element, options);
Tạo một instance TestRenderer
với một element React trong tham số. No không sử dụng DOM thật, nhưng nó vẫn render cây component một cách đầy đủ vào trong bộ nhớ để bạn có thể kiểm định. Trả về một TestRenderer instance..
TestRenderer.act()
TestRenderer.act(callback);
Similar to the act()
helper from react-dom/test-utils
, TestRenderer.act
prepares a component for assertions. Use this version of act()
to wrap calls to TestRenderer.create
and testRenderer.update
.
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()
testRenderer.toJSON()
Trả về một object thể hiện cậy được render. Cây này chỉ bao gồm các node riêng cho các nền tảng như <div>
hay <View>
và thuộc tính (prop) của chúng, nhưng không bao gồm bất kỳ component do người dùng viết. Việc này tiện cho thử snapshot.
testRenderer.toTree()
testRenderer.toTree()
Trả về một object thể hiện cậy được render. Không như toJSON()
, sự thể hiện này chi tiết hơn kết quả được cung cấp bởi toJSON()
, và nó bao gồm cả những component do người dùng viết. Bạn cỏ thể không cần hàm này trừ khi bạn đang viết thư viện kiểm định trên test renderer.
testRenderer.update()
testRenderer.update(element)
Render lại cây trong bộ nhớ với một element gốc mới. Việc này giả lập một sự cập nhật của React tại gốc. Nếu element mới có cùng loại (type) và key (khoá) với element trước, cây sẽ được cập nhật; nếu không, nó sẽ mount lại một cây mới.
testRenderer.unmount()
testRenderer.unmount()
Gỡ (unmount) cây trong bộ nhớ, phát ra các sự kiện vòng đời (lifecycle events) tương ứng.
testRenderer.getInstance()
testRenderer.getInstance()
Trả về một instance tương ứng với element gốc, nếu có. Việc này sẽ không hoạt động nếu element gốc là một function component vì nó không có intance.
testRenderer.root
testRenderer.root
Trả về object “test instance” gốc hữu dụng cho việc kiểm định những node nhất định trong cây. Bạn có thể dùng nó để tìm những test instance” khác sâu bên dưới.
testInstance.find()
testInstance.find(test)
Tìm một test instance ngay bên dưới khi test(testInstance)
trả về true
. Nếu test(testInstance)
không trả về true
cho đúng một test instance, một lỗi sẽ được ném ra.
testInstance.findByType()
testInstance.findByType(type)
Tìm một test instance ngay bên dưới với type
được cung cấp. Nếu không có chính xác một test instance với type
được cung cấp, nó sẽ ném ra một lỗi.
testInstance.findByProps()
testInstance.findByProps(props)
Tìm một test instance ngay bên dưới với props
được cung cấp. Nếu không có chính xác một test instance với props
được cung cấp, nó sẽ ném ra một lỗi.
testInstance.findAll()
testInstance.findAll(test)
Tìm tất cả test instance ngay bên dưới khi test(testInstance)
trả về true
.
testInstance.findAllByType()
testInstance.findAllByType(type)
Tìm tất cả test instance với type
được cung cấp.
testInstance.findAllByProps()
testInstance.findAllByProps(props)
Tìm tất cả test instance với props
được cung cấp.
testInstance.instance
testInstance.instance
Component instance tương ứng với test instance này. Nó chỉ khả dụng cho những class component, vì những function component không có instance. Nó tương đương với giá trị của this
trong component.
testInstance.type
testInstance.type
Loại compoennt tương ứng với test instance này. Vi dụ, một component <Button />
có loại là Button
.
testInstance.props
testInstance.props
Thuộc tính (props) tương ứng với test instance này. Ví dụ, một component <Button size="small" />
thì có props là {size: 'small'}
testInstance.parent
testInstance.parent
Test instance cha của test instance này.
testInstance.children
testInstance.children
Những test instance con của test instance này.
Ý tưởng
Bạn có thể truyền hàm createNodeMock
vào TestRenderer.create
như một tuỳ chọn, nó cho phép tuỳ chỉnh mock refs.
createNodeMock
nhận vào element hiện tại và sẽ trả về mốt object mock ref.
Việc này hữu dụng cho việc thử một component phụ thuộc vào refs.
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);