PHPUnitред "рдореИрдВ рдЕрдкрдиреЗ рд▓рд╛рдирдд рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реВрдВ", рдпрд╛ рд╕рдВрджреЗрд╣рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг

рд╣рд╛рдп, рд╣реИрдмреНрд░ред

рдЫрд╡рд┐

рд╣рд╛рдВ, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдФрд░ рдкреЛрд╕реНрдЯ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ? рд╕рднреА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╡реЗ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рд░ рдХреЛрдИ рдЦреБрд╢ рд╣реИ! рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреЛрд╕реНрдЯ рд╣реИрдВ ... рдХрд┐рд╕реА рдХреЛ рдХреИрд╕реЗ рдЕрдкрдорд╛рдирд┐рдд рдХрд░рдирд╛ рд╣реИ ... рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг! рдирд╣реАрдВ, рд╕рдЪ рдореЗрдВ! рдЖрдЬ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдмрд┐рд▓реНрд▓реА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рддреНрд╡рд░рд┐рдд рдЧреБрдЧрд▓реА рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдирдХреЗ рдмрд▓реНрдХ рдореЗрдВ рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

1) рдПрдХ рдХреЙрдкреАрд░рд╛рдЗрдЯрд░ рдХреА рдЦреБрд╢реАред рдкрд╣рд▓реЗ рд╣рдо рдПрдХ рд▓рдВрдмрд╛ рдкрд░рд┐рдЪрдп рджреЗрдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкреНрд░рд╛рдЪреАрди рд░реВрд╕ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕, рдлрд┐рд░ рджрд╕ рдЬреАрд╡рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╣реИрдХ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдгред рдЗрд╕ рддрд░рд╣ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде:

<?php class Calculator { public function plus($a, $b) { return $a + $b; } } 

рдФрд░ рдореИрдВ рдЕрднреА рдордЬрд╛рдХ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдзреНрдпрдпрди рдЧрд╛рдЗрдб рдХреЗ рд░реВрдк рдореЗрдВ "рдХреИрд▓рдХреБрд▓реЗрдЯрд░" рд╡рд╛рд▓реЗ рд▓реЗрдЦреЛрдВ рдХреЛ рджреЗрдЦрд╛ред рд╣рд╛рдВ, рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ, рд╕рд╛рд░, рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдм рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ! рдФрд░ рдлрд┐рд░ рдЙрд▓реНрд▓реВ рдХреЛ рдЦрддреНрдо рдХрд░реЛ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ

2) рдЕрддреНрдпрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рдЙрджрд╛рд╣рд░рдгред рдФрд░ рдЪрд▓реЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ Gitlab CI рдореЗрдВ рд░рдЯрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкрд╛рд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдореЗрдВ PHP рд╕рдВрдХреНрд░рдордг рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдм рдХреБрдЫ рд╣рдбрд╕рди рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрд╕ рд╢реИрд▓реА рдореЗрдВред рдпрд╣ рдЙрдкрдпреЛрдЧреА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдк рдмрд╕ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдпреЗ рд╕рднреА рдирд┐рд░рдВрддрд░рддрд╛ - рдареАрдХ рд╣реИ, рдлрд┐рд░ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдирд╣реАрдВред

рдирддреАрдЬрддрди, рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдВрджреЗрд╣ рд╣реИ, "рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред" рдореИрдВ, рдмрджрд▓реЗ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░ рддреБрд░рдВрдд рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ - рдореИрдВ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВ, рдореИрдВ рдкрд░реАрдХреНрд╖рдХ рдирд╣реАрдВ рд╣реВрдВред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВ рдЦреБрдж рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдФрд░ рдореЗрд░реЗ рдЬреАрд╡рди рдХрд╛ рдкрд╣рд▓рд╛ рд╢рдмреНрдж "рдореЛрдХ" рд╢рдмреНрдж рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдЯреАрдбреАрдбреА рдкрд░ рдХрднреА рдХрд╛рдо рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХреМрд╢рд▓ рдХреЗ рдореЗрд░реЗ рдореМрдЬреВрджрд╛ рд╕реНрддрд░ рдиреЗ рдореБрдЭреЗ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ, рдФрд░ рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рджрд░реНрдЬрди рдмрдЧ рдкрдХрдбрд╝ рд▓рд┐рдП рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдЗрд╕рдиреЗ рдореЗрд░реА рдорджрдж рдХреА, рддреЛ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рдкрдХрдбрд╝реЗ рдЧрдП рдХреАрдбрд╝реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдХрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рдкреНрд░рд╢реНрди-рдЙрддреНрддрд░ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╢реИрдХреНрд╖рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдореБрдЭреЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ? рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ Yii рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЛрд╣рдирд╛? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐% one_more_framework_name%?
рдПрдХ: рдирд╣реАрдВ, PHPUnit рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рд╕реНрд╡-рдирд┐рд░реНрдорд┐рдд рдврд╛рдВрдЪреЗ рдкрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рдкрд░ рднреА рдкреЗрдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд╢реНрди: рдФрд░ рдЕрдм рдореИрдВ рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдПрдХ: рдХрдИ рджрд░реНрдЬрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ "рд░рди" рдХрдИ рд╕реЗрдХрдВрдб рддрдХ рд░рд╣рддрд╛ рд╣реИред рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рд╣рдореЗрд╢рд╛ рддреЗрдЬ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рднреА рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рд╢реНрди: рдореЗрд░реЗ рдкрд╛рд╕ 2000 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдПрдХ: рд╣рд╛рдБ рдФрд░ рдирд╣реАрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рд╛рдВ, рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдХреЛрдб рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдиреАрдВрд╡ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред 2000 рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ, рд╢рд╛рдЦрд╛рдПрдВ, рд╕реАрдорд╛ рдорд╛рдорд▓реЗ рд╣реЛрдВрдЧреЗред рдпрд╣ рдЕрдВрдд рдореЗрдВ рдпрд╣ рд╕рдм рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХреЛрдб рдЬрд┐рддрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИред рдмреЗрд╣рддрд░ рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдкреБрд░рд╛рдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдардВрдбрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЫрд╡рд┐

рдкреНрд░рд╢реНрди: рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд░рд▓ рддрд░реАрдХреЗ (рдХрд╛рд░реНрдп) рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ? рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рдЧрд▓рддреА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ!
рдП: рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЯреАрдбреАрдбреА рдирд╣реАрдВ рд╣реИ) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╕ рдХрд╛рд░реНрдп рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ "рдареАрдХ" рдХрд░рддреЗ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЬрдм рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг: рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдИрдореЗрд▓ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рдмрдирд╛рддреА рд╣реИред

 function isValid($email) { $regex = "very_complex_regex_here"; if (is_array($email)) { $result = true; foreach ($email as $item) { if (preg_match($regex, $item) === 0) { $result = false; } } } else { $result = preg_match($regex, $emai) ==! 0; } return $result; } 

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

рдкреНрд░рд╢реНрди: рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдХреБрдЫ рд╕рдордЭ рдореЗрдВ рдХрдм рдЖрдирд╛ рд╢реБрд░реВ рд╣реЛрдЧрд╛?
рдП: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬреИрд╕реЗ рд╣реА рдЖрдк рдХреЛрдб рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред рдХрд░реАрдм рдХрд╡рд░реЗрдЬ 100% рд╣реИ, рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкрд░реАрдХреНрд╖рдгред рджреВрд╕рд░реЗ, рдЬреИрд╕реЗ рд╣реА рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдХреЛрдб рдХреЗ рдЬрдЯрд┐рд▓ рднрд╛рдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд░реАрдХреНрд╖рдг рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕реАрдорд╛рд╡рд░реНрддреА рдорд╛рдорд▓реЗ)ред рддреАрд╕рд░реА рдмрд╛рдд, рдЬрдм рдЦреБрдж рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реЛрдВ! рдЕрдХреНрд╕рд░ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ рдЬрдм рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рд╕реЗ рдХреЛрдб рдХреА рдЦрд╛рдорд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

рдкреНрд░рд╢реНрди: рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рд▓рд╛рд░реНрд╡рд╛ рдкрд░ рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реИред рд╕рд╛рдЗрдЯ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рд╕рд╛рдЗрдЯ рдХреЛрдб рдХрд╛ рдПрдХ рдЪрдордХрджрд╛рд░ рдкрд╣рд╛рдбрд╝ рд╣реИред рдпрд╣рд╛рдВ рдХреИрд╕реЗ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ?
A: рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рд╣рдо рдЕрд▓рдЧ рд╕реЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдЕрд▓рдЧ рд╕реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░, рдЕрд▓рдЧ рд╕реЗ рд╕реЗрд╡рд╛рдУрдВ рдЖрджрд┐ рдХрд╛ред

рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛрдб рдХреЗ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред рдЬрд┐рддрдирд╛ рдХрдо рдХреЛрдб рдЖрдк рдПрдХ рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВрдЧреЗ, рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЗ рдЬрд┐рддрдирд╛ рдХрд░реАрдм рд╣реЛ рд╕рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

 <?php class Controller { public function __construct($userService, $emailService) { $this->userService = $userService; $this->emailService = $emailService; } public function login($request) { if (empty($request->login) || empty($request->password)) { return "Auth error"; } $password = $this->userService->getPasswordFor($request->login); if (empty($password)) { return "Auth error - no password"; } if ($password !== $request->password) { return "Incorrect password"; } $this->emailService->sendEmail($request->login); return "Success"; } } // .... /* somewhere in project core */ $controller = new Controller($userService, $emailService); $controller->login($request); 

рдпрд╣ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИред рд╣рдо рд╕рднреА рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╣реА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдФрд░ рд╕рдлрд▓ рд▓реЙрдЧрд┐рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рдИрдореЗрд▓ред рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рд╣реИрдВ - $ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрд╡рд╛ рдФрд░ $ рдИрдореЗрд▓ рд╕реЗрд╡рд╛ред рдЙрдиреНрд╣реЗрдВ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдПрдХ рдкрд╛рд╕ рдореЗрдВ рдХрдо рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдмреЗрд╣рддрд░ред

рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рдореЛрдХрдиреЗрдо (рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗред рдирдХрд▓реА рд╡рд╕реНрддреБ, рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрде: "рдСрдмреНрдЬреЗрдХреНрдЯ-рдкреИрд░реЛрдбреА") рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рднреА рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЙрдХрд░реА рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдЖрдЗрдП рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЛрдХ рдмрдирд╛рдПрдБред

 $userService = Mockery::mock('user_service'); $emailService = Mockery::mock('email_service'); 

рдЕрдм $ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдлрд╝реАрд▓реНрдб рдХреА рдЬрд╛рдБрдЪ рдХреЗ рддрд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдорд╛рд░рд╛ рддрд░реАрдХрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд (!) рд╕рдВрджреЗрд╢ рд▓реМрдЯрд╛ рджреЗрдЧрд╛ред

 function testEmptyLogin() { $userService = Mockery::mock('user_service'); $emailService = Mockery::mock('email_service'); $controller = new Controller($userService, $emailService); $request = (object) []; $result = $controller->login($request); } 

рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛? рд╣рдордиреЗ рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдмреНрд╕ рдмрдирд╛рдП, рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛, рдФрд░ рдПрдХ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЧрд▓рдд рдЕрдиреБрд░реЛрдз рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ "рдЦреАрдВрдЪ" рд▓рд┐рдпрд╛ред рдЬрд╡рд╛рдм рдорд┐рд▓ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕реЗ рдХреИрд╕реЗ рдЬрд╛рдВрдЪреЗрдВ? рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ - рддрдерд╛рдХрдерд┐рдд рдЬреЛрд░ред PHPUnit рдореЗрдВ рджрд░реНрдЬрдиреЛрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рджрд╛рд╡реЗ рд╣реИрдВ ред рдмрд╕ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

 function testEmptyLogin() { $userService = Mockery::mock('user_service'); $emailService = Mockery::mock('email_service'); $controller = new Controller($userService, $emailService); $request = (object) []; $result = $controller->login($request); // vv assertion here! vv $this->assertEquals("Auth error", $result); } 

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

 function testEmptyPassword() { $userService = Mockery::mock('user_service'); // $userService->getPasswordFor(__any__arg__); // '' $userService->shouldReceive('getPasswordFor')->andReturn(''); $emailService = Mockery::mock('email_service'); $request = (object) [ 'login' => 'john', 'pass' => '1234' ]; $result = (new Controller($userService, $emailService))->login($request); $this->assertEquals("Auth error - no password", $result); } function testUncorrectPassword() { $userService = Mockery::mock('user_service'); // $userService->getPasswordFor(__any__arg__); // '4321' $userService->shouldReceive('getPasswordFor')->andReturn('4321'); $emailService = Mockery::mock('email_service'); $request = (object) [ 'login' => 'john', 'pass' => '1234' ]; $result = (new Controller($userService, $emailService))->login($request); $this->assertEquals("Incorrect password", $result); } function testSuccessfullLogin() { $userService = Mockery::mock('user_service'); // $userService->getPasswordFor(__any__arg__); // '1234' $userService->shouldReceive('getPasswordFor')->andReturn('1234'); $emailService = Mockery::mock('email_service'); $request = (object) [ 'login' => 'john', 'pass' => '1234' ]; $result = (new Controller($userService, $emailService))->login($request); $this->assertEquals("Success", $result); } 

рдХрдВрдзреЗ рдФрд░ рдиреЛрдЯрд┐рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ? рд╡реЗ рд╣рдореЗрдВ рдЙрди рд╕реНрдЯрдмреНрд╕ рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд╣реА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдЧрд▓рдд рдкрд╛рд╕рд╡рд░реНрдб рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣рдо рдПрдХ рд╕реНрдЯрдм $ userService рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рдкрд╛рд╕рд╡рд░реНрдб рджреЗрддрд╛ рд╣реИред рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИред

рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛, рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВред рд╣рдо рддреЛ рдЙрдиреНрд╣реЗрдВ "рдбреВрдм" рдЧрдпрд╛, рдФрд░ рдЕрдЧрд░ рд╡реЗ рдЯреВрдЯ рдЧрдП рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрддрдо рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рд▓реЙрдЧрд┐рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЙрдореНрдореАрдж рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред рдФрд░ рдлрд┐рд░ рд╣рдо рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди, рдкреГрдердХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгред рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдирддреАрдЬрддрди, рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░реАрдХреНрд╖рдг рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХреЛрдб рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдЗрд╕рдХреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реЛред рдФрд░ рдЪреВрдВрдХрд┐ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рднреА рдЧрд╛рд░рдВрдЯреА рд╣реИред рдирддреАрдЬрддрди, рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рдХреЛрдб рдХреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдХрд╛рдо рдХреЗ рддрд░реНрдХ рдХреЛ рднреА рддреЛрдбрд╝рддрд╛ рд╣реИ, рддреБрд░рдВрдд рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ - рдореИрдВрдиреЗ рдирд╣реАрдВ рдмрддрд╛рдпрд╛, PHPUnit рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рд░рд╡реЗрд▓ рдореЗрдВ, рд╡рд┐рдХреНрд░реЗрддрд╛ / рдмрд┐рди / phpunit рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рдВрджреЗрд╢ рджреЗрдЦрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ

рдЫрд╡рд┐ - рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рд░рд╣реЗред рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ

рдЫрд╡рд┐ рд╕рд╛рдд рдореЗрдВ рд╕реЗ рдПрдХ рджрд╛рд╡рд╛ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред

"рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕реЗ рдореЗрд░реЗ рд╣рд╛рде рдХреНрдпрд╛ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ?" рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ

 <?php function getInfo($infoApi, $userName) { $response = $infoApi->getInfo($userName); if ($response->status === "API Error") { return null; } return $response->result; } // ... somewhere in system $api = new ExternalApi(); $info = getInfo($api, 'John'); if ($info === null) { die('Api is down'); } echo $info; 

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

 function getInfo($infoApi, $userName): string { $response = $infoApi->getInfo($userName); if ($response->status === "API Error") { throw new ApiException($response); } return $response->result; } 

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

 function testApiFail() { $api = Mockery::mock('api'); $api->shouldReceive('getInfo')->andReturn((object) [ 'status' => 'API Error' ]); $result = getInfo($api, 'name'); $this->assertNull($result); } 

рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рд┐рдЧреЗрд╕реА рдиреВрдбрд▓реНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ 20-30 рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж рдЖрдк рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдмрд╛рдж - рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рддрд╣рдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдирдпрд╛, рдардВрдбрд╛, рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ, рдФрд░ рд▓рд┐рдЦреЗрдВ рдХрд┐ рдХреМрди рд╕рд╛ рд▓реЗрдЦрдХ govnokoder% рдлреНрд░реЗрдорд╡рд░реНрдХ_name% рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ %__% рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдореИрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢ рд░рд╣реВрдВрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдХрд┐рд╕реА рдФрд░ рдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреА рдЦреЛрдЬ рдХреА, рдФрд░ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХрддрд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрддрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдпрд╛!

рдпрдереЛрдЪрд┐рдд рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

Source: https://habr.com/ru/post/hi485418/


All Articles