рдореЙрдХ рдореЙрдбреНрдпреВрд▓: рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдбрдореА рдореЙрдХрдЕрдк

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

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

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдм inflatable рд░реЙрдХреЗрдЯ рд▓рд╛рдВрдЪрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреВрд░реА inflatable рднреВрдорд┐ рдЬрд┐рд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд░реАрдХреНрд╖рдг рд░реЙрдХреЗрдЯ рдФрд░ рд╡рд┐рдорд╛рди рдЙрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред





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

рдкреИрдХреЗрдЬ 1 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╕реЗ рдХрдо рдХрд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИ:

$ pip install mock
рдпрд╛
$ easy_install mock

рдФрд░ рдЕрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдорд╛рд░реЛрд╣ рдУрд╡рд░рд░рд╛рдЗрдб



рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдХреБрдЫ рдорд╛рдирддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП:

 from itertools import permutations def real(name): if len(name) < 10: raise ValueError('String too short to calculate statistics.') y = 0 for i in permutations(xrange(len(name)), 10): y += i print y 


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

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

 from mock import patch import itertools # :   ,    name = '  ' >>> with patch('itertools.permutations') as perm_mock: ... perm_mock.return_value = xrange(3) ... real(name) 1 3 6 


рдиреЛрдЯ: 42 рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рд┐рдВрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ! / (42 - 10)! рдХреЗрд╡рд▓ 3 рдмрд╛рд░, рдпрд╛рдиреА рдЪрдХреНрд░ xrange (3) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рдж, itertools.permutations рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреА рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯ рдЖрдпрд╛ред

рдбрд┐рдмрдЧ рдЬрд╛рдирдХрд╛рд░реА



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

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

-002

рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЙрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:



рдКрдкрд░ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ () рдлрд╝рдВрдХреНрд╢рди рдХреНрд░рдордЪрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рдЖрдк assert_ * рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 perm_mock.assert_called_with(xrange(len(name)), 10) 


рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЪреАрдиреА



Django рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреИрдЪ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

 @patch('itertools.permutations') def test(ip): ip.return_value = range(5) print list(itertools.permutations(xrange(10), 10)) >>> test() [0, 1, 2, 3, 4] 


рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ рдЪреЗрди рдореЙрдХрдЕрдк рдХреЙрд▓ рдХрд░реЗрдВ



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

 mock_file = Mock() mock_file.name = 'my_filename.doc' mock_file.__iter__.return_value = [' 1', ' 2', ' 3'] stat = mock_file.stat.return_value stat.size, stat.access_time = 1000, datetime(2012, 1, 1) 


рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рд╛ рдХрд╛ рдХреЛрдб рдХрд┐рддрдирд╛ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред рд╡реИрд╕реЗ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдпрд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛, рдЙрдиреНрд╣реЗрдВ рднреЗрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо рджреЗрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ:

 >>> mock_a = Mock(name=' ') >>> mock_a <Mock name=' ' id='169542476'> 


рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ?

 >>> m = Mock() >>> m <Mock id='167387660'> >>> m.any_attribute <Mock name='mock.any_attribute' id='167387436'> >>> m.any_attribute <Mock name='mock.any_attribute' id='167387436'> >>> m.another_attribute <Mock name='mock.another_attribute' id='167185324'> 


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

 >>> m() <Mock name='mock()' id='167186284'> >>> m() is m False 


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

рдпрджрд┐ рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ: рдЕрдЧрд▓реА рдХреЙрд▓ рдкрд░ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдореВрд▓реНрдп рдорд┐рд▓рддрд╛ рд╣реИ:

 >>> m.any_attribute <Mock name='mock.any_attribute' id='167387436'> >>> m.any_attribute = 5 >>> m.any_attribute 5 


рдирд╛рдо рдХреЗ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреМрди рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВ, рдпрд╣ рдХрдХреНрд╖рд╛ рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрдврд╝рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред

рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рдХреИрд╕реЗ рд╕реАрдорд┐рдд рдХрд░реЗрдВ



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

 class Tanchik(object): model = 'T80' def shoot(self, target): print '!' def tank_sugar(target): print '%s ' % tank.model tank.shoot(target) return tank ================== import tanks @patch('tanks.Tanchik', spec=tanks.Tanchik) # <<==   spec def test_tank(tank_mock): assert isinstance(tank_sugar(tank_mock), tanks.Tanchik) 


рдЕрдм рдпрджрд┐ рд╣рдо рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рддреЗ рд╣реИрдВ рдпрд╛ рдЯреИрдВрдХ рдХреЗ рд▓рд┐рдП рд╢реВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯреИрдВрдХ_рд╕реБрдЧрд░ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рд▓реЗрдЖрдЙрдЯ рдХреЛ рдХреИрд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдП



рдЦреИрд░, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЙрдХ рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдорд╛рди (рд░рд┐рдЯрд░реНрди_рд╡реЗрд▓реНрдпреВ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕реЗ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ? 2 рддрд░реАрдХреЗ рд╣реИрдВ:


 def simple_function(args): do_something_useful() with patch('module.BigHeavyClass', side_effect=simple_function) as mock_class: another_class.take(mock_class) 


рд╡реИрд╕реЗ, рдЖрдкрдХреЛ simple_function рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЖрдЙрдЯрдкреБрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, mock_class рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдб рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрдк method_calls рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди



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

 >>> mock = Mock() >>> mock_bz2module.open.return_value.__enter__ = Mock(return_value='foo') >>> mock_bz2module.open.return_value.__exit__ = Mock(return_value=False) >>> with mock_bz2module.open('test.bz2') as m: ... assert m == 'foo' 


рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдПрдХ рдорд╛рдирдХ рдСрдмреНрдЬреЗрдХреНрдЯ (рд╕реВрдЪреА, рдлрд╝рд╛рдЗрд▓, рд╕рдВрдЦреНрдпрд╛) рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдЬрд┐рдХрдореЙрдХ рдХреНрд▓рд╛рд╕ рд╣реИред

рдЬрд╣рд╛рдВ рдирдХрд▓реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ



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

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

рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рдореЗрдВ, рдореЙрдХ рдбрд┐рдмрдЧрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PuDB рдореЗрдВ, рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реБрдИред IPDB рдиреЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ IPDB рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдпрд╛, рдФрд░ PuDB рдкрд░ рд╕рд┐рд░реНрдл рдХреЛрдбред

рдирд┐рд╖реНрдХрд░реНрд╖



рдореЙрдХ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдХрд╣реАрдВ рднреА рдФрд░ рдХрднреА рднреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рддреЗрдЬ рд╡рд┐рдХрд╛рд╕, рдФрд░, рд╕рдВрднрд╡рддрдГ, рддреЗрдЬ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред

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

рд▓реЗрдЖрдЙрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╣рд╛рд░реНрдб (рдпреБрдХреНрддрд┐) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд▓рдЪреАрд▓реЗрдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдкреИрдЪ рдХреЛрдИ рдирд┐рд╢рд╛рди рдирд╣реАрдВ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВред

рд╕рдВрджрд░реНрдн




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


All Articles