рдореИрдВрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░ рд▓рд┐рдЦрд╛ рдФрд░ рдЗрд╕реЗ
GitHub рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред рдореЗрд░реЗ рдмрд┐рд▓реНрдбрд░ рдХреЛ рдЬреЗрд╕реНрдЯ-рд╕реНрдиреИрдкрд╢реЙрдЯ-рдмреБрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рдПрдХ HTML рдкреБрд╕реНрддрдХ рдмрдирд╛рддрд╛ рд╣реИред

рд▓реЗрдЦ рдореЗрдВ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА рдХрд┐ рдЬреЗрд╕реНрдЯ рдХреНрдпрд╛ рд╣реИ, рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд░реАрдХреНрд╖рдг, рдЬрд┐рд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред рдЕрд╕рд▓ рдореЗрдВ, рдпрд╣ рд╕рдм рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдХреНрд░рдордмрджреНрдз рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреЗрдЬрд┐рдиреЗрдЯрд░ рд░рд┐рдПрдХреНрдЯрд░ рдШрдЯрдХ
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ рдореЗрдВ рд╣рдо
рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдШрдЯрдХ (
рдкреЗрдЬрд┐рдиреЗрдЯрд░ ) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред рдпрд╣ AWS (
GitHub ) рдореЗрдВ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдШрдЯрдХ рдХрд╛ рдХрд╛рд░реНрдп рдПрдХ рдореЗрдЬ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рдкрдиреНрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЯрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред
рдпрд╣ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдШрдЯрдХ (рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдШрдЯрдХ) рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рд╣реИред рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдХреБрд▓ рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдФрд░ рдкреЗрдЬ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдШрдЯрдХ рдПрдХ рдЧрдард┐рдд рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рдмрдЯрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдиреНрдп рдмрд╛рд▓
рдмрдЯрди рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХрдИ рдкреГрд╖реНрда рд╣реИрдВ, рддреЛ рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдЙрди рд╕рднреА рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдИрдкреНрд╕рд┐рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдШрдЯрдХ рдХреЛрдбimport React from 'react'; import classes from './Paginator.css'; import Button from '../../UI/Button/Button'; const Paginator = (props) => { const { tp, cp, pageClickHandler } = props; let paginator = null; if (tp !== undefined && tp > 0) { let buttons = []; buttons.push( <Button key={`pback`} disabled={cp === 1} clicked={(cp === 1 ? null : event => pageClickHandler(event, 'back'))}> тЖР </Button> ); const isDots = (i, tp, cp) => i > 1 && i < tp && (i > cp + 1 || i < cp - 1) && (cp > 4 || i > 5) && (cp < tp - 3 || i < tp - 4); let flag; for (let i = 1; i <= tp; i++) { const dots = isDots(i, tp, cp) && (isDots(i - 1, tp, cp) || isDots(i + 1, tp, cp)); if (flag && dots) { flag = false; buttons.push( <Button key={`p${i}`} className={classes.Dots} disabled={true}> ... </Button> ); } else if (!dots) { flag = true; buttons.push( <Button key={`p${i}`} disabled={i === cp} clicked={(i === cp ? null : event => pageClickHandler(event, i))}> {i} </Button> ); } } buttons.push( <Button key={`pforward`} disabled={cp === tp} clicked={(cp === tp ? null : event => pageClickHandler(event, 'forward'))}> тЖТ </Button> ); paginator = <div className={classes.Paginator}> {buttons} </div> } return paginator; } export default Paginator;
рдмрдЯрди рдШрдЯрдХ рдХреЛрдб import React from 'react'; import classes from './Button.css'; const button = (props) => ( <button disabled={props.disabled} className={classes.Button + (props.className ? ' ' + props.className : '')} onClick={props.clicked}> {props.children} </button> ); export default button;
рдЬреЗрд╕реНрдЯ
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдУрдкрдирд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдпрд╣ рдлреЗрд╕рдмреБрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдмрдирд╛рдпрд╛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред Node.js. рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛
рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЕрд░реНрде рдЗрд╕ рддрдереНрдп рд╕реЗ рдХрдо рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдЙрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдЬреЗрд╕реНрдЯ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
Jestjs.io рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдгред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ Node.js рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рджреЛ рдирдВрдмрд░ (
sum.js рдлрд╝рд╛рдЗрд▓) рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
function sum(a, b) { return a + b; } module.exports = sum;
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
sum.test.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреА рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реИ:
const sum = require('./sum'); test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); });
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ
'1 + 2 рдХреЛ рдмрд░рд╛рдмрд░ 3' рдХрд╣рддреЗ рд╣реБрдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдпрд╛ред
рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ
рдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ
1 рдФрд░
2 рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдЬреЗрд╕реНрдЯ рдХреА
рдЕрдкреЗрдХреНрд╖рд╛ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рдЬреЗрд╕реНрдЯ
рдЯреВ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕рдВрдЪрд╛рд░рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдкреЗрдХреНрд╖рд╛ (
3 ) рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдЯреЛрдмреА () рдлрд╝рдВрдХреНрд╢рди рдЬреЗрд╕реНрдЯ (рдореИрдЪрд░реНрд╕) рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдмрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░
рдЬреЗрд╕реНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдЬреЗрд╕реНрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди
.test.js рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓
рдвреВрдВрдвреЗрдЧрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╡рд╣ рдЙрддреНрдкрд╛рджрди рд╣реЛрдЧрд╛:
PASS ./sum.test.js тЬУ adds 1 + 2 to equal 3 (5ms)
рдШрдЯрдХреЛрдВ рдХреЗ рдПрдВрдЬрд╛рдЗрдо рдФрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд░реАрдХреНрд╖рдг
рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд░реАрдХреНрд╖рдг рдЬреЗрд╕реНрдЯ рдореЗрдВ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, рд╣рдо рдЬреЗрд╕реНрдЯ рд╕реЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдХреЗ рдкрд░реАрдХреНрд╖рдг рд░рди рдХреЗ рджреМрд░рд╛рди, рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдирдП рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдиреИрдкрд╢реЙрдЯ рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рдкрд╛рда рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ (рдпрд╣рд╛рдБ рд╕рд░рдгреА рдХреБрдВрдЬреА рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдирд╛рдо рд╣реИ):
exports[`some test name`] = ` Object { "Hello": "world" } `;
рдпрд╣ рдЬреЗрд╕реНрдЯ рдЯреЗрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рдЫрд╡рд┐ рддреБрд▓рдирд╛ (рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░) рдХрд░рддрд╛ рд╣реИ:
expect(value).toMatchSnapshot(propertyMatchers, snapshotName)
рдорд╛рди рдХрд┐рд╕реА рднреА рдХреНрд░рдордмрджреНрдз рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░,
toMatchSnapshot () рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдмрд╛рдж рдХреЗ рд╕рдордп рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреБрд▓рдирд╛ рдХрд░реЗрдЧрд╛ред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╣реА рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рднреАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдШрдЯрдХ рдХреЛ
рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдПрдВрдЬрд╛рдЗрдо рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдШрдЯрдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдПрдВрдЬрд╛рдЗрдо Airbnb рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдВрдЬрд╛рдЗрдо рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдкрд╛рджрди рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:
- рдкреВрд░реНрдг рдкреНрд░рддрд┐рдкрд╛рджрди (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдкреВрд░реНрдг рдбреЛрдо рдкреНрд░рддрд┐рдкрд╛рджрди);
- рд╕рд░рд▓реАрдХреГрдд рдкреНрд░рддрд┐рдкрд╛рджрди (рдЙрдерд▓реЗ рдкреНрд░рддрд┐рдкрд╛рджрди);
- рд╕реНрдерд┐рд░ рдкреНрд░рддрд┐рдкрд╛рджрди
рд╣рдо рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рддрд▓реНрд▓реАрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╕реНрдереИрддрд┐рдХ рдкреНрд░рддрд┐рдкрд╛рджрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдШрдЯрдХ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдХреЗ рд╕реНрдерд┐рд░ HTML-рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
const wrapper = render(<Foo title="unique" />);
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░
рдЙрдореНрдореАрдж рдХреЗ
рдореБрддрд╛рдмрд┐рдХ рд░рд┐рдЬрд▓реНрдЯ () рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░
.toMatchSnapshot () рдлрдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди
рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИред
... const wrapper = render(<Paginator tp={tp} cp={cp} />); it(`Total = ${tp}, Current = ${cp}`, () => { expect(wrapper).toMatchSnapshot(); }); ...
рд╣рд░ рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг
рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, toMatchSnapshot () рджреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ:
рдЕрдкреЗрдХреНрд╖рд┐рдд (рдЬреЛ рдкрд╣рд▓реЗ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛) рдФрд░
рд╡рд░реНрддрдорд╛рди (рдЬреЛ рд╡рд░реНрддрдорд╛рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
рдпрджрд┐ рдЪрд┐рддреНрд░ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкрд╛рд╕ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ)ред
рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдЬреЗрд╕реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЫрд╡рд┐ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдЯрди рд╣реИред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдШрдЯрдХ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХрд╛рд░рдг рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рддреЛ рдЙрд╕реЗ рдкреБрд░рд╛рдиреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдирдП рдХреЗ рд╕рд╛рде рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЕрдЧрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВ рдПрдХ
рдкреЗрдЬрд┐рдиреЗрдЯрд░ (рдлрд╝рд╛рдЗрд▓
Paginator.test.js ) рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг
рджреВрдВрдЧрд╛ ред
рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ
рд╕реНрдиреИрдкрд╢реЙрдЯ (tp, cp) рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЬреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗрдЧрд╛: рдкреГрд╖реНрдареЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрдаред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдЧрд╛ред рд╕рднреА рдЕрд╡рд╢реЗрд╖реЛрдВ рдХреЛ
рд╕реНрдиреИрдкрд╢реЙрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд▓реВрдк рдореЗрдВ) рдФрд░ рдкрд░реАрдХреНрд╖рдг, рдкрд░реАрдХреНрд╖рдг ... рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ
import React from 'react'; import { configure, render } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import Paginator from './Paginator'; configure({ adapter: new Adapter() }); describe('Paginator', () => { const snapshoot = (tp, cp) => { const wrapper = render(<Paginator tp={tp} cp={cp} />); it(`Total = ${tp}, Current = ${cp}`, () => { expect(wrapper).toMatchSnapshot(); }); } snapshoot(0, 0); snapshoot(1, -1); snapshoot(1, 1); snapshoot(2, 2); snapshoot(3, 1); for (let cp = 1; cp <= 10; cp++) { snapshoot(10, cp); } });
рдЖрдкрдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА
рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдЕрдзреВрд░реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рднрд╛рд╡рдирд╛ рдиреЗ рдореБрдЭреЗ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреБрдЫ рдШрдЯрдХ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рд╕рд╛рд░реЗ HTML рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ? рдпрд╣рд╛рдБ рдПрдХ 3-рдмрдЯрди рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдШрдЯрдХ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдШрдЯрдХ рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
exports[`Paginator Total = 1, Current = -1 1`] = ` <div class="Paginator" > <button class="Button" > тЖР </button> <button class="Button" > 1 </button> <button class="Button" > тЖТ </button> </div> `;
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХ рдХрд╛ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред HTML рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯ рд░реВрдк рдореЗрдВ рджреЗрдЦрдХрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рд╕рд┐рд░реНрдл рддреАрди рдмрдЯрди рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЗрдЬ рдпрд╛ рдХреБрдЫ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЪрдордХрджрд╛рд░? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдХрдард┐рди рд╣реЛрдЧрд╛ред
рдлрд┐рд░, рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИред рдЙрдирдХреЗ рдПрдЪрдЯреАрдПрдордПрд▓-рдХреЛрдб рдХреА рдХрдард┐рдирд╛рдИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ, рдЕрдВрддрд░ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╢рд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЙрд╕реА рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдЙрди рдкрд░ рд▓рд╛рдЧреВ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЬреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░ рд▓рд┐рдЦрдХрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛ред
рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рдпрд╣реА рдореБрдЭреЗ рдорд┐рд▓рд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░рд╛ рдмрд┐рд▓реНрдбрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреБрд╕реНрддрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдЖрдк рдШрдЯрдХреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рддреБрд░рдВрдд рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЬреЗрд╕реНрдЯ рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░реНрд╕
рдЬреЗрд╕реНрдЯ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ Node.JS рдкрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
onRunStart ,
onTestStart ,
onTestResult ,
onRunComplete , рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдЧрддрд┐ рдХреА рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред
рдлрд┐рд░ рдЖрдкрдХреЛ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░ рдореЗрдВ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖
рд╕рдВрд╡рд╛рджрджрд╛рддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдмрд┐рд▓реНрдбрд░ рдХреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ
рд╕рдВрд╡рд╛рджрджрд╛рддрд╛рдУрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬреЗрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдб, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдЬреЗрд╕реНрдЯ-рд╕реНрдиреИрдкрд╢реЙрдЯреНрд╕-рдмреБрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ
рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓реЗрдЦ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдирд╣реАрдВ рдбрд╛рд▓реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдФрд░ рд╕реБрдзрд╛рд░реВрдВрдЧрд╛ред рдпрд╣ рдореЗрд░реЗ GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ рдкрд░
src / index.js рдлрд╝рд╛рдЗрд▓ рд╣реИ ред
рдореЗрд░реА рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░ рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреЛрдб
onRunComplete (рд╕рдВрджрд░реНрдн, рдкрд░рд┐рдгрд╛рдо) рд╡рд┐рдзрд┐ рдореЗрдВ рдбрд╛рд▓рд╛ред рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
Results.testResults рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ, Jest рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИред рдореЗрд░реА рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░ рд╕рдВрдЧрдд рд╕реНрдиреИрдкрд╢реЙрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕реНрдиреИрдкрд╢реЙрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреБрд╕реНрддрдХ рдореЗрдВ рдПрдХ HTML рдкреГрд╖реНрда рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдиреИрдкрд╢реЙрдЯ-рдкреБрд╕реНрддрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИред
HTML рдкреЗрдЬ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдЧреНрд░реИрдмрд╕реАрдПрд╕рдПрд╕ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдлрдВрдХреНрд╢рди
(рдореЙрдбреНрдпреВрд▓рдирд╛рдо, рд╕реАрдПрд╕рдПрд╕ = [], рд▓реЗрд╡рд▓ = 0) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░, рд╕рднреА рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдШрдЯрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЖрдпрд╛рдд рд╡рд╛рд▓реЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рдкреЗрдбрд╝ рдХреЛ рдиреАрдЪреЗ
рдЧрд┐рд░рд╛рддрд╛ рд╣реИ ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд╝рдВрдХреНрд╢рди рдЙрди рд╕рднреА рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдШрдЯрдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдПрдХрддреНрд░рд┐рдд рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреБрд╕реНрддрдХ рдХреЗ HTML рдкреГрд╖реНрда рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд┐рд▓реНрдбрд░ рджреЛ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде HTML рдкреГрд╖реНрда рдореЗрдВ рдПрдХ iFrame рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ: рд╕реНрд░реЛрдд рдХреЛрдб (рдЫрд╡рд┐ рдЬреИрд╕рд╛ рд╣реИ) рдФрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдмрд╛рдж рдШрдЯрдХред IFrame рдореЗрдВ рдбрд┐рд╕реНрдкреНрд▓реЗ рдСрдкреНрд╢рди рдорд╛рдЙрд╕ рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЬреЗрд╕реНрдЯ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд╣ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд╣ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдКрдкрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджреЗрдЦреЗрдВ)ред
рдЗрд╕рдореЗрдВ рд╡рд┐рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдВрддрд░ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рджреЛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
рдЕрдкреЗрдХреНрд╖рд┐рдд рдФрд░
рд╡рд╛рд╕реНрддрд╡рд┐рдХ ред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкреЗрдХреНрд╖рд┐рдд рдПрдХ рд╣реИ - рдпрд╣ рд╕реНрдиреИрдкрд╢реЙрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдЬреЗрд╕реНрдЯ рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдерд╛ рдЬреЛ рдХрд┐ рдореИрд╕реЗрдЬ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЬреЗрд╕реНрдЯ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдмрд┐рд▓реНрдбрд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд iFrame рд╕реНрдиреИрдкрд╢реЙрдЯ iFrame рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рддреАрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ: рд╕реНрд░реЛрдд рдХреЛрдб, рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдмрд╛рдж рдШрдЯрдХ, рдЕрд▓рдЧред
рд░рд┐рдкреЛрд░реНрдЯ рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд░реНрдмреЛрдЬрд╝ = рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ
рдкреБрдирд╢реНрдЪ
рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд░реАрдХреНрд╖рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдЙрдирдХреЗ рдХрд╛рдордХрд╛рдЬ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдиреИрдкрд╢реЙрдЯ рдкрд░реАрдХреНрд╖рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдШрдЯрдХ рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдФрд░ рдЬреЗрд╕реНрдЯ-рд╕реНрдиреИрдкрд╢реЙрдЯ-рдмреБрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред