Test Renderer
Импорт хийх
import TestRenderer from 'react-test-renderer'; // ES6
const TestRenderer = require('react-test-renderer'); // ES5 with npmТойм
Уг пакэжэд React компонентыг DOM эсвэл натив мобайл орчноос үл хамааран, цэвэр Javascript объект руу рендэр хийхэд ашиглагдах React Renderer байгаа.
React DOM эсвэл React Native компонентын рендэр хийсэн платформын харагдацыг дэс дараалалтай яг тухайн үеийнхээр харахад тусална.
React DOM эсвэл React Native компонентын рендэр хийсэн платформын харагдацыг хөтөч, jsdom ашиглахгүйгээр, дэс дарааллаар харахад уг пакэж тусална (DOM салбар модны нэгэн адил)
Жишээ:
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' ] }Та Jest-ын snapshot тест хийх функцыг ашиглан автоматаар файлын JSON tree-ын хуулбарыг хадгалах боломжтой ба өөрчлөлт орсон эсэхийг шалгах боломжтой: Дэлгэрэнгүйг.
Та мөн үр дүн дотроос нь тодорхой node-ыг олох хайн олж, баталгаажуулах(assertion) боломжтой.
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.instancetestInstance.typetestInstance.propstestInstance.parenttestInstance.children
Reference
TestRenderer.create()
TestRenderer.create(element, options);React-ын дамжуулсан элементийг агуулсан TestRenderer instance үүсгэнэ. Жинхэнэ DOM ашиглахгүй хэрнээ компонентын салбар модыг санах ойд бүрэн рендэр хийдэг. Тэгэхээр нь та баталгаажуулах боломжтой. 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()Рендэр хийсэн салбар модын объектыг буцаана. Уг мод нь <div>, <View> гэх мэт зөвхөн тухайн нэг платформд зориулсан node агуулсан байдаг. Гэхдээ хэрэглэгчийн үүсгэсэн компонент энд байдаггүй. Snapshot testing хийхэд ашиглахад дөхөм байдаг.
testRenderer.toTree()
testRenderer.toTree()Рендэр хийсэн салбар модны объектыг буцаана. toJSON()-ын үүсгэсэн нэгэнтэй харьцуулахад илүү нарийвчилсан харагдах ба хэрэглэгчийн бичсэн компонент байдаг. Test renderer-ээс гадна та өөрийн сан үүсгэн бичээгүй л бол уг метод танд төдийлөн хэрэг болохгүй болов уу.
testRenderer.update()
testRenderer.update(element)Шинэ үндсэн элементийг агуулсан санах ой дахь модыг дахин рендэр хийнэ. Ингэснээр React-ын update-ыг бүр үндсээр нь хийгдэх боломж өгнө. Хэрэв шинэ элемент нь ижил төрлийнх байгаад, өмнөх элемент шиг чухал гол элемент мөн бол салбар мод нь шинэчлэгдэнэ. Үгүй бол шинэ салбар модыг дахин mount хийнэ.
testRenderer.unmount()
testRenderer.unmount()Санах ой дахь салбар модыг unmount хийнэ. Энэ нь холбогдох амьдралын мөчлөг эвент эхлүүлнэ.
testRenderer.getInstance()
testRenderer.getInstance()Хэрэв үндсэн элементэд холбогдох instance байвал түүн рүү буцна. Тухайн үндсэн элемент нь функц компонент бол ажиллахгүй. Яагаад гэвэл instance байхгүй.
testRenderer.root
testRenderer.rootСалбар мод дахь тодорхой node-ыг баталгаажуулахад туслах “test instance” бүхий үндсэн объект руу буцна. Та үүнийг ашиглан салбар модны бүтцийн доогуур байгаа бусад “test instances”-ыг олж болно.
testInstance.find()
testInstance.find(test)test(testInstance) нь true гэж буцах удамшсан, дан test instance-ыг олно. Хэрэв тухайн нэг test instance-д test(testInstance) нь true гэж гарахгүй бол алдаа гарна.
testInstance.findByType()
testInstance.findByType(type)Тухайн type-т зохих удамшсан, дан test instance-ыг олно. Хэрэв тухайн type-т таарах нэг test instance байхгүй бол алдаа гарна.
testInstance.findByProps()
testInstance.findByProps(props)Тухайн props-т зохих удамшсан, дан test instance-ыг олно. Хэрэв тухайн props-т таарах нэг test instance байхгүй бол алдаа гарна.
testInstance.findAll()
testInstance.findAll(test)test(testInstance) нь true гэж буцах бүх удамшсан test instance-уудыг олно.
testInstance.findAllByType()
testInstance.findAllByType(type)Тухайн type-д нийцэх бүх удамшсан test instance-ыг олно.
testInstance.findAllByProps()
testInstance.findAllByProps(props)Тухайн props-т нийцэх бүх удамшсан test instance-ыг олно.
testInstance.instance
testInstance.instanceУг test instance-т холбогдох компонент instance. Функц компонентууд instance байхгүй учраас зөвхөн класс компонентууд л байна. Өгөгдсөн компонентын доторх this утгатай таардаг.
testInstance.type
testInstance.typeУг test instance-т холбогдох компонентын төрөл. Жишээ нь <Button /> компонент нь Button гэсэн төрөлтэй.
testInstance.props
testInstance.propsУг test instance-т холбогдох пропс. Жишээ нь <Button size="small" /> компонент нь {size: 'small'} гэсэн пропстой.
testInstance.parent
testInstance.parentТухайн test instance-ын эцэг test instance.
testInstance.children
testInstance.childrenТухайн test instance-ын хүү test instance.
Ideas
Та createNodeMock функцийг TestRenderer.create-руу сонголтоор өгч, дамжуулж болно. Тэгвэл тусгай mock refs үүсэх боломжтой болно. createNodeMock нь одоогийн элементийг хүлээн авах ба mock ref объектыг буцаана. 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);