PHPUnit: рдирдХрд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕



  1. рдХреНрдпреЛрдВ рди рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛рдП
  2. рдореБрдЦреНрдп рд▓рд╛рдн рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИ
  3. рдореЛрдХреА - рджреЗрд╢реА
  4. рдареВрдВрда рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛
  5. рдЧреАрд▓рд╛ рдЧреБрдг
  6. рдирдХрд▓реА рдЗрдВрдЬреЗрдХреНрд╢рди
  7. рдкрд░рд╛рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ
  8. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ


рдХреНрдпреЛрдВ рди рдордЬрд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛рдП


PHPUnit рдорд╛рдирдХ, PHP рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдо рдврд╛рдВрдЪрд╛ рд╣реИред рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ - рд╡рд╣ рдЕрдкрдиреЗ рд╕рд╛рде рд╕реМрдВрдкреЗ рдЧрдП рдХрд░реНрддрд╡реНрдпреЛрдВ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдирдХрд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рдХрдИ рд▓реЛрдЧ рдЗрд╕рдХреА рдмреЛрдЭрд┐рд▓ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдореЛрдЪрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдореЙрдХрд░реА (рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд▓рдЧрдЗрди рдирд╣реАрдВ рд╣реИ)ред

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

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

рдореБрдЦреНрдп рд▓рд╛рдн рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИ


PHPUnit рдореЗрдВ рдПрдХ рдореЛрдХ (рддреАрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

$mock = $this->getMockBuilder('MyClass') ->setMethods(['getBool', 'getNumber', 'getString']) ->disableOriginalConstructor() ->getMock(); $mock->expects($this->any()) ->method('getBool') ->will($this->returnValue(true)); $mock->expects($this->any()) ->method('getNumber') ->will($this->returnValue(1)); $mock->expects($this->any()) ->method('getString') ->will($this->returnValue('string')); 


рдЬреЛ рд▓реЛрдЧ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЧреАрд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдмрд╣реБрдд рдЬрд▓реНрджреА рдмрдврд╝рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк XPMock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореЛрдХрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдмрд╣реБрдд рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

 $this->mock('MyClass') ->getBool(true) ->getNumber(1) ->getString('string') ->new(); 


рдореЛрдХреА - рджреЗрд╢реА


XPMock
- рдЕрдкрдиреА рдЦреБрдж рдХреА рдореЛрдХреА рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ
- PHPUnit рдореЛрдХреНрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реИрдкрд░ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ
- рд╕рднреА рдореВрд▓ PHPUnit рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 $mock->getNumber($this->once()) 


рдпрд╣ рд▓реЗрдЦрди рдХреЗ рд╕рдорд╛рди рд╣реИ

 $mock->expects($this->once()) ->method('getNumber') ->will($this->returnValue(null)) 


рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рдЫреЛрдЯреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: github.com/ptrofimov/xpmock

рдареВрдВрда рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛


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

XPMock рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдЯрдм рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХ рдореЙрдХ рд▓реМрдЯрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд░рд┐рдХреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдХреНрд╕ рдмрдирд╛рддреЗ рд╕рдордп рд╕реЗрдЯрдореЗрдереЛрдбреНрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдирдХрд▓реА рдЧреБрдг


PHPUnit рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдордЬрд╝рд╛рдХ рдХреИрд╕реЗ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред XPMock рднреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдореЛрдХ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореЛрдХрд╛ рдмрдирд╛рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдирдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

 $this->mock('MyClass') ->__set('property', $value) ->new(); 


рдЖрдк рдЬрд╛рджреВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЧреБрдгреЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирдХрд▓реА рдЗрдВрдЬреЗрдХреНрд╢рди


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

 $this->mock('MyClass') ->injectTo($object, 'property') ->new(); 


рдкрд░рд╛рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ


XPMock рдкрд░рд╛рд╡рд░реНрддрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓рдШреБ рд╡рд╛рдХреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдирд┐рдЬреА рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:

 $property = new \ReflectionProperty('MyClass', 'property'); $property->setAccessible(true); $value = $property->getValue($object); 


XPMock рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 $value = $this->reflect('MyClass')->property; 


рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмрдВрдж / рдЦреБрд▓реЗ рд╕реНрдерд┐рд░ / рдЧреИрд░-рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдирд┐рдЬреА рддрд░реАрдХреЛрдВ рдХреЛ рднреА рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ


XPMock рдЖрд╕рд╛рдиреА рд╕реЗ рдореМрдЬреВрджрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ PHPUnit рдореЙрдм рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдХрд▓реНрдк 1. рдореМрдЬреВрджрд╛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ XPMock рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реЗрдВ (PHP> = 5.4 рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд)

 class MyTestCase extends \PHPUnit_Framework_TestCase { use \Xpmock\TestCaseTrait; } 


рд╡рд┐рдХрд▓реНрдк 2. рд╕рдВрдмрдВрдзрд┐рдд XPMock рд╡рд░реНрдЧ (PHP> = 5.3 рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд) рд╕реЗ рдкрд░реАрдХреНрд╖рд╛ рд╡рд░реНрдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВ

 class MyTestCase extends \Xpmock\TestCase { } 


рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ XPMock рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ - рд╕рдВрдЧреАрддрдХрд╛рд░ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред 2-рдЪрд░рдгреАрдп рд╕реНрдерд╛рдкрдирд╛ рдирд┐рд░реНрджреЗрд╢ рдпрд╣рд╛рдБ - github.com/ptrofimov/xpmock#installation

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


All Articles