Intro to React Component Driver
Prezentacija Praktikantams
Table of Contents
1. React Component Driver
(╯°□°)╯︵ ┻━┻
2. Agenda
- Istorija
- Demo: Read Test Renderer
- Demo: React Component Driver
ir TDD - Ateities Vizija
3. Kas yra React Component Driver?
- React Test Renderer apvalkalas.
- Įrankių rinkinys leidžiantis analizuoti komponentų medį.
- Konstravimas: render, renderComponent, …
- Užklausos: filterBy, getTextNodes, …
- Test Driver konvencija.
- Paslepia komplikuotą konstravimą, manipuliavimą.
- Pasakoja istoriją.
5. Istorija
commit 93e02b2044d3f82ac7526449ec72ca7acd088840 Author: Donatas Petrauskas <donatasp@wix.com> Date: Mon Nov 21 16:17:19 2016 +0200 Try to include custom built testkit.
6. Ko nedaro React Component Driver
- Nevykdo native kodo. Tam skirtas Detox.
- Nepalengvina testų rašymo.
7. Demo: React Test Renderer
- Importavimas
- Renderer objektas
- Komponentų medis
- Komponento evoliucija
8. Komponento Evoliucija
function Counter() {
const [count, setCount] = React.useState(0);
return (<button onClick={() => setCount(count + 1)}>Count is {count}</button>);
}
9. Demo: React Component Driver
- Užklausos
ComponentDriver
10. Ateities Vizija
12. REPL
babel > const React = require('react')
undefined
babel > const {create} = require('react-test-renderer')
undefined
babel > const pp = (x) => console.log(JSON.stringify(x, null, 2))
undefined
babel > create(<div />).toJSON()
{ type: 'div', props: {}, children: null }
babel > create(<div id="app" />).toJSON()
{ type: 'div', props: { id: 'app' }, children: null }
babel > create(<div>Hello, World!</div>).toJSON()
{ type: 'div', props: {}, children: [ 'Hello, World!' ] }
babel > pp(create(<div><span>Hello, World!</span><button/></div>).toJSON())
{
"type": "div",
"props": {},
"children": [
{
"type": "span",
"props": {},
"children": [
"Hello, World!"
]
},
{
"type": "button",
"props": {},
"children": null
}
]
}
undefined
babel > const onClick = () => console.log('Hello!')
undefined
babel > const button = create(<button onClick={onClick}>Click Me!</button>).toJSON()
undefined
babel > button.props.onClick()
Hello!
undefined
babel > function Counter() {
const [count, setCount] = React.useState(0);
return (<button onClick={() => setCount(count + 1)}>Count is {count}</button>);
}
undefined
babel > const renderer = create(<Counter />)
undefined
babel > renderer.toJSON()
{
type: 'button',
props: { onClick: [Function: onClick] },
children: [ 'Count is ', '0' ]
}
babel > renderer.toJSON().props.onClick()
undefined
babel > renderer.toJSON()
{
type: 'button',
props: { onClick: [Function: onClick] },
children: [ 'Count is ', '1' ]
}
babel > const RCD = require('react-component-driver')
undefined
babel > RCD
{
withContext: [Function: withContext],
ComponentDriver: [Function: ComponentDriver],
componentDriver: [Function: factory],
render: [Function: render],
renderComponent: [Function: renderComponent],
toJSON: [Function: toJSON],
filterBy: [Function: filterBy],
filterByTestID: [Function: filterByTestID],
filterByType: [Function: filterByType],
getTextNodes: [Function: getTextNodes]
}
babel > const {filterByTestID, filterBy, getTextNodes, renderComponent, toJSON, ComponentDriver} = RCD
undefined
babel > renderComponent(Counter, {}).toJSON()
{
type: 'button',
props: { onClick: [Function: onClick] },
children: [ 'Count is ', '0' ]
}
babel > toJSON(renderComponent(Counter, {}))
{
type: 'button',
props: { onClick: [Function] },
children: [ 'Count is ', '0' ]
}
babel > function Counter() {
const [count, setCount] = React.useState(0);
return (
<div>
<div testID="COUNT">{count}</div>
<button testID="COUNTER_BUTTON" onClick={() => setCount(count + 1)}>+</button>
</div>
);
}
undefined
babel > const r = renderComponent(Counter, {})
undefined
babel > const x = toJSON(r)
undefined
babel > pp(x)
{
"type": "div",
"props": {},
"children": [
" ",
{
"type": "div",
"props": {
"testID": "COUNT"
},
"children": [
"0"
]
},
" ",
{
"type": "button",
"props": {
"testID": "COUNTER_BUTTON"
},
"children": [
"+"
]
},
" "
]
}
undefined
babel > filterByTestID('COUNT', x)
[ { type: 'div', props: { testID: 'COUNT' }, children: [ '0' ] } ]
babel > filterByTestID('X', x)
[]
babel > getTextNodes(filterByTestID('COUNT', x))
[ '0' ]
babel > filterByTestID('COUNTER_BUTTON', x)[0].props.onClick()
undefined
babel > pp(filterByTestID('COUNT', toJSON(r)))
[
{
"type": "div",
"props": {
"testID": "COUNT"
},
"children": [
"1"
]
}
]
undefined
babel > const CounterDriver = class extends ComponentDriver {
constructor() {
super(Counter);
}
clickPlusButton() {
this.getByID('COUNTER_BUTTON').props.onClick();
return this;
}
getCount() {
return this.getByID('COUNT').children[0];
}
}
undefined
babel > new CounterDriver().clickPlusButton().clickPlusButton().getCount()
'2'
babel >