testpatch.py 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899
  1. # Copyright (C) 2007-2012 Michael Foord & the mock team
  2. # E-mail: fuzzyman AT voidspace DOT org DOT uk
  3. # http://www.voidspace.org.uk/python/mock/
  4. import os
  5. import sys
  6. import unittest
  7. from unittest.test.testmock import support
  8. from unittest.test.testmock.support import SomeClass, is_instance
  9. from test.test_importlib.util import uncache
  10. from unittest.mock import (
  11. NonCallableMock, CallableMixin, sentinel,
  12. MagicMock, Mock, NonCallableMagicMock, patch, _patch,
  13. DEFAULT, call, _get_target
  14. )
  15. builtin_string = 'builtins'
  16. PTModule = sys.modules[__name__]
  17. MODNAME = '%s.PTModule' % __name__
  18. def _get_proxy(obj, get_only=True):
  19. class Proxy(object):
  20. def __getattr__(self, name):
  21. return getattr(obj, name)
  22. if not get_only:
  23. def __setattr__(self, name, value):
  24. setattr(obj, name, value)
  25. def __delattr__(self, name):
  26. delattr(obj, name)
  27. Proxy.__setattr__ = __setattr__
  28. Proxy.__delattr__ = __delattr__
  29. return Proxy()
  30. # for use in the test
  31. something = sentinel.Something
  32. something_else = sentinel.SomethingElse
  33. class Foo(object):
  34. def __init__(self, a):
  35. pass
  36. def f(self, a):
  37. pass
  38. def g(self):
  39. pass
  40. foo = 'bar'
  41. @staticmethod
  42. def static_method():
  43. return 24
  44. @classmethod
  45. def class_method(cls):
  46. return 42
  47. class Bar(object):
  48. def a(self):
  49. pass
  50. foo_name = '%s.Foo' % __name__
  51. def function(a, b=Foo):
  52. pass
  53. class Container(object):
  54. def __init__(self):
  55. self.values = {}
  56. def __getitem__(self, name):
  57. return self.values[name]
  58. def __setitem__(self, name, value):
  59. self.values[name] = value
  60. def __delitem__(self, name):
  61. del self.values[name]
  62. def __iter__(self):
  63. return iter(self.values)
  64. class PatchTest(unittest.TestCase):
  65. def assertNotCallable(self, obj, magic=True):
  66. MockClass = NonCallableMagicMock
  67. if not magic:
  68. MockClass = NonCallableMock
  69. self.assertRaises(TypeError, obj)
  70. self.assertTrue(is_instance(obj, MockClass))
  71. self.assertFalse(is_instance(obj, CallableMixin))
  72. def test_single_patchobject(self):
  73. class Something(object):
  74. attribute = sentinel.Original
  75. @patch.object(Something, 'attribute', sentinel.Patched)
  76. def test():
  77. self.assertEqual(Something.attribute, sentinel.Patched, "unpatched")
  78. test()
  79. self.assertEqual(Something.attribute, sentinel.Original,
  80. "patch not restored")
  81. def test_patchobject_with_string_as_target(self):
  82. msg = "'Something' must be the actual object to be patched, not a str"
  83. with self.assertRaisesRegex(TypeError, msg):
  84. patch.object('Something', 'do_something')
  85. def test_patchobject_with_none(self):
  86. class Something(object):
  87. attribute = sentinel.Original
  88. @patch.object(Something, 'attribute', None)
  89. def test():
  90. self.assertIsNone(Something.attribute, "unpatched")
  91. test()
  92. self.assertEqual(Something.attribute, sentinel.Original,
  93. "patch not restored")
  94. def test_multiple_patchobject(self):
  95. class Something(object):
  96. attribute = sentinel.Original
  97. next_attribute = sentinel.Original2
  98. @patch.object(Something, 'attribute', sentinel.Patched)
  99. @patch.object(Something, 'next_attribute', sentinel.Patched2)
  100. def test():
  101. self.assertEqual(Something.attribute, sentinel.Patched,
  102. "unpatched")
  103. self.assertEqual(Something.next_attribute, sentinel.Patched2,
  104. "unpatched")
  105. test()
  106. self.assertEqual(Something.attribute, sentinel.Original,
  107. "patch not restored")
  108. self.assertEqual(Something.next_attribute, sentinel.Original2,
  109. "patch not restored")
  110. def test_object_lookup_is_quite_lazy(self):
  111. global something
  112. original = something
  113. @patch('%s.something' % __name__, sentinel.Something2)
  114. def test():
  115. pass
  116. try:
  117. something = sentinel.replacement_value
  118. test()
  119. self.assertEqual(something, sentinel.replacement_value)
  120. finally:
  121. something = original
  122. def test_patch(self):
  123. @patch('%s.something' % __name__, sentinel.Something2)
  124. def test():
  125. self.assertEqual(PTModule.something, sentinel.Something2,
  126. "unpatched")
  127. test()
  128. self.assertEqual(PTModule.something, sentinel.Something,
  129. "patch not restored")
  130. @patch('%s.something' % __name__, sentinel.Something2)
  131. @patch('%s.something_else' % __name__, sentinel.SomethingElse)
  132. def test():
  133. self.assertEqual(PTModule.something, sentinel.Something2,
  134. "unpatched")
  135. self.assertEqual(PTModule.something_else, sentinel.SomethingElse,
  136. "unpatched")
  137. self.assertEqual(PTModule.something, sentinel.Something,
  138. "patch not restored")
  139. self.assertEqual(PTModule.something_else, sentinel.SomethingElse,
  140. "patch not restored")
  141. # Test the patching and restoring works a second time
  142. test()
  143. self.assertEqual(PTModule.something, sentinel.Something,
  144. "patch not restored")
  145. self.assertEqual(PTModule.something_else, sentinel.SomethingElse,
  146. "patch not restored")
  147. mock = Mock()
  148. mock.return_value = sentinel.Handle
  149. @patch('%s.open' % builtin_string, mock)
  150. def test():
  151. self.assertEqual(open('filename', 'r'), sentinel.Handle,
  152. "open not patched")
  153. test()
  154. test()
  155. self.assertNotEqual(open, mock, "patch not restored")
  156. def test_patch_class_attribute(self):
  157. @patch('%s.SomeClass.class_attribute' % __name__,
  158. sentinel.ClassAttribute)
  159. def test():
  160. self.assertEqual(PTModule.SomeClass.class_attribute,
  161. sentinel.ClassAttribute, "unpatched")
  162. test()
  163. self.assertIsNone(PTModule.SomeClass.class_attribute,
  164. "patch not restored")
  165. def test_patchobject_with_default_mock(self):
  166. class Test(object):
  167. something = sentinel.Original
  168. something2 = sentinel.Original2
  169. @patch.object(Test, 'something')
  170. def test(mock):
  171. self.assertEqual(mock, Test.something,
  172. "Mock not passed into test function")
  173. self.assertIsInstance(mock, MagicMock,
  174. "patch with two arguments did not create a mock")
  175. test()
  176. @patch.object(Test, 'something')
  177. @patch.object(Test, 'something2')
  178. def test(this1, this2, mock1, mock2):
  179. self.assertEqual(this1, sentinel.this1,
  180. "Patched function didn't receive initial argument")
  181. self.assertEqual(this2, sentinel.this2,
  182. "Patched function didn't receive second argument")
  183. self.assertEqual(mock1, Test.something2,
  184. "Mock not passed into test function")
  185. self.assertEqual(mock2, Test.something,
  186. "Second Mock not passed into test function")
  187. self.assertIsInstance(mock2, MagicMock,
  188. "patch with two arguments did not create a mock")
  189. self.assertIsInstance(mock2, MagicMock,
  190. "patch with two arguments did not create a mock")
  191. # A hack to test that new mocks are passed the second time
  192. self.assertNotEqual(outerMock1, mock1, "unexpected value for mock1")
  193. self.assertNotEqual(outerMock2, mock2, "unexpected value for mock1")
  194. return mock1, mock2
  195. outerMock1 = outerMock2 = None
  196. outerMock1, outerMock2 = test(sentinel.this1, sentinel.this2)
  197. # Test that executing a second time creates new mocks
  198. test(sentinel.this1, sentinel.this2)
  199. def test_patch_with_spec(self):
  200. @patch('%s.SomeClass' % __name__, spec=SomeClass)
  201. def test(MockSomeClass):
  202. self.assertEqual(SomeClass, MockSomeClass)
  203. self.assertTrue(is_instance(SomeClass.wibble, MagicMock))
  204. self.assertRaises(AttributeError, lambda: SomeClass.not_wibble)
  205. test()
  206. def test_patchobject_with_spec(self):
  207. @patch.object(SomeClass, 'class_attribute', spec=SomeClass)
  208. def test(MockAttribute):
  209. self.assertEqual(SomeClass.class_attribute, MockAttribute)
  210. self.assertTrue(is_instance(SomeClass.class_attribute.wibble,
  211. MagicMock))
  212. self.assertRaises(AttributeError,
  213. lambda: SomeClass.class_attribute.not_wibble)
  214. test()
  215. def test_patch_with_spec_as_list(self):
  216. @patch('%s.SomeClass' % __name__, spec=['wibble'])
  217. def test(MockSomeClass):
  218. self.assertEqual(SomeClass, MockSomeClass)
  219. self.assertTrue(is_instance(SomeClass.wibble, MagicMock))
  220. self.assertRaises(AttributeError, lambda: SomeClass.not_wibble)
  221. test()
  222. def test_patchobject_with_spec_as_list(self):
  223. @patch.object(SomeClass, 'class_attribute', spec=['wibble'])
  224. def test(MockAttribute):
  225. self.assertEqual(SomeClass.class_attribute, MockAttribute)
  226. self.assertTrue(is_instance(SomeClass.class_attribute.wibble,
  227. MagicMock))
  228. self.assertRaises(AttributeError,
  229. lambda: SomeClass.class_attribute.not_wibble)
  230. test()
  231. def test_nested_patch_with_spec_as_list(self):
  232. # regression test for nested decorators
  233. @patch('%s.open' % builtin_string)
  234. @patch('%s.SomeClass' % __name__, spec=['wibble'])
  235. def test(MockSomeClass, MockOpen):
  236. self.assertEqual(SomeClass, MockSomeClass)
  237. self.assertTrue(is_instance(SomeClass.wibble, MagicMock))
  238. self.assertRaises(AttributeError, lambda: SomeClass.not_wibble)
  239. test()
  240. def test_patch_with_spec_as_boolean(self):
  241. @patch('%s.SomeClass' % __name__, spec=True)
  242. def test(MockSomeClass):
  243. self.assertEqual(SomeClass, MockSomeClass)
  244. # Should not raise attribute error
  245. MockSomeClass.wibble
  246. self.assertRaises(AttributeError, lambda: MockSomeClass.not_wibble)
  247. test()
  248. def test_patch_object_with_spec_as_boolean(self):
  249. @patch.object(PTModule, 'SomeClass', spec=True)
  250. def test(MockSomeClass):
  251. self.assertEqual(SomeClass, MockSomeClass)
  252. # Should not raise attribute error
  253. MockSomeClass.wibble
  254. self.assertRaises(AttributeError, lambda: MockSomeClass.not_wibble)
  255. test()
  256. def test_patch_class_acts_with_spec_is_inherited(self):
  257. @patch('%s.SomeClass' % __name__, spec=True)
  258. def test(MockSomeClass):
  259. self.assertTrue(is_instance(MockSomeClass, MagicMock))
  260. instance = MockSomeClass()
  261. self.assertNotCallable(instance)
  262. # Should not raise attribute error
  263. instance.wibble
  264. self.assertRaises(AttributeError, lambda: instance.not_wibble)
  265. test()
  266. def test_patch_with_create_mocks_non_existent_attributes(self):
  267. @patch('%s.frooble' % builtin_string, sentinel.Frooble, create=True)
  268. def test():
  269. self.assertEqual(frooble, sentinel.Frooble)
  270. test()
  271. self.assertRaises(NameError, lambda: frooble)
  272. def test_patchobject_with_create_mocks_non_existent_attributes(self):
  273. @patch.object(SomeClass, 'frooble', sentinel.Frooble, create=True)
  274. def test():
  275. self.assertEqual(SomeClass.frooble, sentinel.Frooble)
  276. test()
  277. self.assertFalse(hasattr(SomeClass, 'frooble'))
  278. def test_patch_wont_create_by_default(self):
  279. try:
  280. @patch('%s.frooble' % builtin_string, sentinel.Frooble)
  281. def test():
  282. self.assertEqual(frooble, sentinel.Frooble)
  283. test()
  284. except AttributeError:
  285. pass
  286. else:
  287. self.fail('Patching non existent attributes should fail')
  288. self.assertRaises(NameError, lambda: frooble)
  289. def test_patchobject_wont_create_by_default(self):
  290. try:
  291. @patch.object(SomeClass, 'ord', sentinel.Frooble)
  292. def test():
  293. self.fail('Patching non existent attributes should fail')
  294. test()
  295. except AttributeError:
  296. pass
  297. else:
  298. self.fail('Patching non existent attributes should fail')
  299. self.assertFalse(hasattr(SomeClass, 'ord'))
  300. def test_patch_builtins_without_create(self):
  301. @patch(__name__+'.ord')
  302. def test_ord(mock_ord):
  303. mock_ord.return_value = 101
  304. return ord('c')
  305. @patch(__name__+'.open')
  306. def test_open(mock_open):
  307. m = mock_open.return_value
  308. m.read.return_value = 'abcd'
  309. fobj = open('doesnotexists.txt')
  310. data = fobj.read()
  311. fobj.close()
  312. return data
  313. self.assertEqual(test_ord(), 101)
  314. self.assertEqual(test_open(), 'abcd')
  315. def test_patch_with_static_methods(self):
  316. class Foo(object):
  317. @staticmethod
  318. def woot():
  319. return sentinel.Static
  320. @patch.object(Foo, 'woot', staticmethod(lambda: sentinel.Patched))
  321. def anonymous():
  322. self.assertEqual(Foo.woot(), sentinel.Patched)
  323. anonymous()
  324. self.assertEqual(Foo.woot(), sentinel.Static)
  325. def test_patch_local(self):
  326. foo = sentinel.Foo
  327. @patch.object(sentinel, 'Foo', 'Foo')
  328. def anonymous():
  329. self.assertEqual(sentinel.Foo, 'Foo')
  330. anonymous()
  331. self.assertEqual(sentinel.Foo, foo)
  332. def test_patch_slots(self):
  333. class Foo(object):
  334. __slots__ = ('Foo',)
  335. foo = Foo()
  336. foo.Foo = sentinel.Foo
  337. @patch.object(foo, 'Foo', 'Foo')
  338. def anonymous():
  339. self.assertEqual(foo.Foo, 'Foo')
  340. anonymous()
  341. self.assertEqual(foo.Foo, sentinel.Foo)
  342. def test_patchobject_class_decorator(self):
  343. class Something(object):
  344. attribute = sentinel.Original
  345. class Foo(object):
  346. def test_method(other_self):
  347. self.assertEqual(Something.attribute, sentinel.Patched,
  348. "unpatched")
  349. def not_test_method(other_self):
  350. self.assertEqual(Something.attribute, sentinel.Original,
  351. "non-test method patched")
  352. Foo = patch.object(Something, 'attribute', sentinel.Patched)(Foo)
  353. f = Foo()
  354. f.test_method()
  355. f.not_test_method()
  356. self.assertEqual(Something.attribute, sentinel.Original,
  357. "patch not restored")
  358. def test_patch_class_decorator(self):
  359. class Something(object):
  360. attribute = sentinel.Original
  361. class Foo(object):
  362. def test_method(other_self, mock_something):
  363. self.assertEqual(PTModule.something, mock_something,
  364. "unpatched")
  365. def not_test_method(other_self):
  366. self.assertEqual(PTModule.something, sentinel.Something,
  367. "non-test method patched")
  368. Foo = patch('%s.something' % __name__)(Foo)
  369. f = Foo()
  370. f.test_method()
  371. f.not_test_method()
  372. self.assertEqual(Something.attribute, sentinel.Original,
  373. "patch not restored")
  374. self.assertEqual(PTModule.something, sentinel.Something,
  375. "patch not restored")
  376. def test_patchobject_twice(self):
  377. class Something(object):
  378. attribute = sentinel.Original
  379. next_attribute = sentinel.Original2
  380. @patch.object(Something, 'attribute', sentinel.Patched)
  381. @patch.object(Something, 'attribute', sentinel.Patched)
  382. def test():
  383. self.assertEqual(Something.attribute, sentinel.Patched, "unpatched")
  384. test()
  385. self.assertEqual(Something.attribute, sentinel.Original,
  386. "patch not restored")
  387. def test_patch_dict(self):
  388. foo = {'initial': object(), 'other': 'something'}
  389. original = foo.copy()
  390. @patch.dict(foo)
  391. def test():
  392. foo['a'] = 3
  393. del foo['initial']
  394. foo['other'] = 'something else'
  395. test()
  396. self.assertEqual(foo, original)
  397. @patch.dict(foo, {'a': 'b'})
  398. def test():
  399. self.assertEqual(len(foo), 3)
  400. self.assertEqual(foo['a'], 'b')
  401. test()
  402. self.assertEqual(foo, original)
  403. @patch.dict(foo, [('a', 'b')])
  404. def test():
  405. self.assertEqual(len(foo), 3)
  406. self.assertEqual(foo['a'], 'b')
  407. test()
  408. self.assertEqual(foo, original)
  409. def test_patch_dict_with_container_object(self):
  410. foo = Container()
  411. foo['initial'] = object()
  412. foo['other'] = 'something'
  413. original = foo.values.copy()
  414. @patch.dict(foo)
  415. def test():
  416. foo['a'] = 3
  417. del foo['initial']
  418. foo['other'] = 'something else'
  419. test()
  420. self.assertEqual(foo.values, original)
  421. @patch.dict(foo, {'a': 'b'})
  422. def test():
  423. self.assertEqual(len(foo.values), 3)
  424. self.assertEqual(foo['a'], 'b')
  425. test()
  426. self.assertEqual(foo.values, original)
  427. def test_patch_dict_with_clear(self):
  428. foo = {'initial': object(), 'other': 'something'}
  429. original = foo.copy()
  430. @patch.dict(foo, clear=True)
  431. def test():
  432. self.assertEqual(foo, {})
  433. foo['a'] = 3
  434. foo['other'] = 'something else'
  435. test()
  436. self.assertEqual(foo, original)
  437. @patch.dict(foo, {'a': 'b'}, clear=True)
  438. def test():
  439. self.assertEqual(foo, {'a': 'b'})
  440. test()
  441. self.assertEqual(foo, original)
  442. @patch.dict(foo, [('a', 'b')], clear=True)
  443. def test():
  444. self.assertEqual(foo, {'a': 'b'})
  445. test()
  446. self.assertEqual(foo, original)
  447. def test_patch_dict_with_container_object_and_clear(self):
  448. foo = Container()
  449. foo['initial'] = object()
  450. foo['other'] = 'something'
  451. original = foo.values.copy()
  452. @patch.dict(foo, clear=True)
  453. def test():
  454. self.assertEqual(foo.values, {})
  455. foo['a'] = 3
  456. foo['other'] = 'something else'
  457. test()
  458. self.assertEqual(foo.values, original)
  459. @patch.dict(foo, {'a': 'b'}, clear=True)
  460. def test():
  461. self.assertEqual(foo.values, {'a': 'b'})
  462. test()
  463. self.assertEqual(foo.values, original)
  464. def test_name_preserved(self):
  465. foo = {}
  466. @patch('%s.SomeClass' % __name__, object())
  467. @patch('%s.SomeClass' % __name__, object(), autospec=True)
  468. @patch.object(SomeClass, object())
  469. @patch.dict(foo)
  470. def some_name():
  471. pass
  472. self.assertEqual(some_name.__name__, 'some_name')
  473. def test_patch_with_exception(self):
  474. foo = {}
  475. @patch.dict(foo, {'a': 'b'})
  476. def test():
  477. raise NameError('Konrad')
  478. try:
  479. test()
  480. except NameError:
  481. pass
  482. else:
  483. self.fail('NameError not raised by test')
  484. self.assertEqual(foo, {})
  485. def test_patch_dict_with_string(self):
  486. @patch.dict('os.environ', {'konrad_delong': 'some value'})
  487. def test():
  488. self.assertIn('konrad_delong', os.environ)
  489. test()
  490. def test_patch_dict_decorator_resolution(self):
  491. # bpo-35512: Ensure that patch with a string target resolves to
  492. # the new dictionary during function call
  493. original = support.target.copy()
  494. @patch.dict('unittest.test.testmock.support.target', {'bar': 'BAR'})
  495. def test():
  496. self.assertEqual(support.target, {'foo': 'BAZ', 'bar': 'BAR'})
  497. try:
  498. support.target = {'foo': 'BAZ'}
  499. test()
  500. self.assertEqual(support.target, {'foo': 'BAZ'})
  501. finally:
  502. support.target = original
  503. def test_patch_descriptor(self):
  504. # would be some effort to fix this - we could special case the
  505. # builtin descriptors: classmethod, property, staticmethod
  506. return
  507. class Nothing(object):
  508. foo = None
  509. class Something(object):
  510. foo = {}
  511. @patch.object(Nothing, 'foo', 2)
  512. @classmethod
  513. def klass(cls):
  514. self.assertIs(cls, Something)
  515. @patch.object(Nothing, 'foo', 2)
  516. @staticmethod
  517. def static(arg):
  518. return arg
  519. @patch.dict(foo)
  520. @classmethod
  521. def klass_dict(cls):
  522. self.assertIs(cls, Something)
  523. @patch.dict(foo)
  524. @staticmethod
  525. def static_dict(arg):
  526. return arg
  527. # these will raise exceptions if patching descriptors is broken
  528. self.assertEqual(Something.static('f00'), 'f00')
  529. Something.klass()
  530. self.assertEqual(Something.static_dict('f00'), 'f00')
  531. Something.klass_dict()
  532. something = Something()
  533. self.assertEqual(something.static('f00'), 'f00')
  534. something.klass()
  535. self.assertEqual(something.static_dict('f00'), 'f00')
  536. something.klass_dict()
  537. def test_patch_spec_set(self):
  538. @patch('%s.SomeClass' % __name__, spec=SomeClass, spec_set=True)
  539. def test(MockClass):
  540. MockClass.z = 'foo'
  541. self.assertRaises(AttributeError, test)
  542. @patch.object(support, 'SomeClass', spec=SomeClass, spec_set=True)
  543. def test(MockClass):
  544. MockClass.z = 'foo'
  545. self.assertRaises(AttributeError, test)
  546. @patch('%s.SomeClass' % __name__, spec_set=True)
  547. def test(MockClass):
  548. MockClass.z = 'foo'
  549. self.assertRaises(AttributeError, test)
  550. @patch.object(support, 'SomeClass', spec_set=True)
  551. def test(MockClass):
  552. MockClass.z = 'foo'
  553. self.assertRaises(AttributeError, test)
  554. def test_spec_set_inherit(self):
  555. @patch('%s.SomeClass' % __name__, spec_set=True)
  556. def test(MockClass):
  557. instance = MockClass()
  558. instance.z = 'foo'
  559. self.assertRaises(AttributeError, test)
  560. def test_patch_start_stop(self):
  561. original = something
  562. patcher = patch('%s.something' % __name__)
  563. self.assertIs(something, original)
  564. mock = patcher.start()
  565. try:
  566. self.assertIsNot(mock, original)
  567. self.assertIs(something, mock)
  568. finally:
  569. patcher.stop()
  570. self.assertIs(something, original)
  571. def test_stop_without_start(self):
  572. patcher = patch(foo_name, 'bar', 3)
  573. # calling stop without start used to produce a very obscure error
  574. self.assertRaises(RuntimeError, patcher.stop)
  575. def test_patchobject_start_stop(self):
  576. original = something
  577. patcher = patch.object(PTModule, 'something', 'foo')
  578. self.assertIs(something, original)
  579. replaced = patcher.start()
  580. try:
  581. self.assertEqual(replaced, 'foo')
  582. self.assertIs(something, replaced)
  583. finally:
  584. patcher.stop()
  585. self.assertIs(something, original)
  586. def test_patch_dict_start_stop(self):
  587. d = {'foo': 'bar'}
  588. original = d.copy()
  589. patcher = patch.dict(d, [('spam', 'eggs')], clear=True)
  590. self.assertEqual(d, original)
  591. patcher.start()
  592. try:
  593. self.assertEqual(d, {'spam': 'eggs'})
  594. finally:
  595. patcher.stop()
  596. self.assertEqual(d, original)
  597. def test_patch_dict_class_decorator(self):
  598. this = self
  599. d = {'spam': 'eggs'}
  600. original = d.copy()
  601. class Test(object):
  602. def test_first(self):
  603. this.assertEqual(d, {'foo': 'bar'})
  604. def test_second(self):
  605. this.assertEqual(d, {'foo': 'bar'})
  606. Test = patch.dict(d, {'foo': 'bar'}, clear=True)(Test)
  607. self.assertEqual(d, original)
  608. test = Test()
  609. test.test_first()
  610. self.assertEqual(d, original)
  611. test.test_second()
  612. self.assertEqual(d, original)
  613. test = Test()
  614. test.test_first()
  615. self.assertEqual(d, original)
  616. test.test_second()
  617. self.assertEqual(d, original)
  618. def test_get_only_proxy(self):
  619. class Something(object):
  620. foo = 'foo'
  621. class SomethingElse:
  622. foo = 'foo'
  623. for thing in Something, SomethingElse, Something(), SomethingElse:
  624. proxy = _get_proxy(thing)
  625. @patch.object(proxy, 'foo', 'bar')
  626. def test():
  627. self.assertEqual(proxy.foo, 'bar')
  628. test()
  629. self.assertEqual(proxy.foo, 'foo')
  630. self.assertEqual(thing.foo, 'foo')
  631. self.assertNotIn('foo', proxy.__dict__)
  632. def test_get_set_delete_proxy(self):
  633. class Something(object):
  634. foo = 'foo'
  635. class SomethingElse:
  636. foo = 'foo'
  637. for thing in Something, SomethingElse, Something(), SomethingElse:
  638. proxy = _get_proxy(Something, get_only=False)
  639. @patch.object(proxy, 'foo', 'bar')
  640. def test():
  641. self.assertEqual(proxy.foo, 'bar')
  642. test()
  643. self.assertEqual(proxy.foo, 'foo')
  644. self.assertEqual(thing.foo, 'foo')
  645. self.assertNotIn('foo', proxy.__dict__)
  646. def test_patch_keyword_args(self):
  647. kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
  648. 'foo': MagicMock()}
  649. patcher = patch(foo_name, **kwargs)
  650. mock = patcher.start()
  651. patcher.stop()
  652. self.assertRaises(KeyError, mock)
  653. self.assertEqual(mock.foo.bar(), 33)
  654. self.assertIsInstance(mock.foo, MagicMock)
  655. def test_patch_object_keyword_args(self):
  656. kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
  657. 'foo': MagicMock()}
  658. patcher = patch.object(Foo, 'f', **kwargs)
  659. mock = patcher.start()
  660. patcher.stop()
  661. self.assertRaises(KeyError, mock)
  662. self.assertEqual(mock.foo.bar(), 33)
  663. self.assertIsInstance(mock.foo, MagicMock)
  664. def test_patch_dict_keyword_args(self):
  665. original = {'foo': 'bar'}
  666. copy = original.copy()
  667. patcher = patch.dict(original, foo=3, bar=4, baz=5)
  668. patcher.start()
  669. try:
  670. self.assertEqual(original, dict(foo=3, bar=4, baz=5))
  671. finally:
  672. patcher.stop()
  673. self.assertEqual(original, copy)
  674. def test_autospec(self):
  675. class Boo(object):
  676. def __init__(self, a):
  677. pass
  678. def f(self, a):
  679. pass
  680. def g(self):
  681. pass
  682. foo = 'bar'
  683. class Bar(object):
  684. def a(self):
  685. pass
  686. def _test(mock):
  687. mock(1)
  688. mock.assert_called_with(1)
  689. self.assertRaises(TypeError, mock)
  690. def _test2(mock):
  691. mock.f(1)
  692. mock.f.assert_called_with(1)
  693. self.assertRaises(TypeError, mock.f)
  694. mock.g()
  695. mock.g.assert_called_with()
  696. self.assertRaises(TypeError, mock.g, 1)
  697. self.assertRaises(AttributeError, getattr, mock, 'h')
  698. mock.foo.lower()
  699. mock.foo.lower.assert_called_with()
  700. self.assertRaises(AttributeError, getattr, mock.foo, 'bar')
  701. mock.Bar()
  702. mock.Bar.assert_called_with()
  703. mock.Bar.a()
  704. mock.Bar.a.assert_called_with()
  705. self.assertRaises(TypeError, mock.Bar.a, 1)
  706. mock.Bar().a()
  707. mock.Bar().a.assert_called_with()
  708. self.assertRaises(TypeError, mock.Bar().a, 1)
  709. self.assertRaises(AttributeError, getattr, mock.Bar, 'b')
  710. self.assertRaises(AttributeError, getattr, mock.Bar(), 'b')
  711. def function(mock):
  712. _test(mock)
  713. _test2(mock)
  714. _test2(mock(1))
  715. self.assertIs(mock, Foo)
  716. return mock
  717. test = patch(foo_name, autospec=True)(function)
  718. mock = test()
  719. self.assertIsNot(Foo, mock)
  720. # test patching a second time works
  721. test()
  722. module = sys.modules[__name__]
  723. test = patch.object(module, 'Foo', autospec=True)(function)
  724. mock = test()
  725. self.assertIsNot(Foo, mock)
  726. # test patching a second time works
  727. test()
  728. def test_autospec_function(self):
  729. @patch('%s.function' % __name__, autospec=True)
  730. def test(mock):
  731. function.assert_not_called()
  732. self.assertRaises(AssertionError, function.assert_called)
  733. self.assertRaises(AssertionError, function.assert_called_once)
  734. function(1)
  735. self.assertRaises(AssertionError, function.assert_not_called)
  736. function.assert_called_with(1)
  737. function.assert_called()
  738. function.assert_called_once()
  739. function(2, 3)
  740. function.assert_called_with(2, 3)
  741. self.assertRaises(TypeError, function)
  742. self.assertRaises(AttributeError, getattr, function, 'foo')
  743. test()
  744. def test_autospec_keywords(self):
  745. @patch('%s.function' % __name__, autospec=True,
  746. return_value=3)
  747. def test(mock_function):
  748. #self.assertEqual(function.abc, 'foo')
  749. return function(1, 2)
  750. result = test()
  751. self.assertEqual(result, 3)
  752. def test_autospec_staticmethod(self):
  753. with patch('%s.Foo.static_method' % __name__, autospec=True) as method:
  754. Foo.static_method()
  755. method.assert_called_once_with()
  756. def test_autospec_classmethod(self):
  757. with patch('%s.Foo.class_method' % __name__, autospec=True) as method:
  758. Foo.class_method()
  759. method.assert_called_once_with()
  760. def test_autospec_with_new(self):
  761. patcher = patch('%s.function' % __name__, new=3, autospec=True)
  762. self.assertRaises(TypeError, patcher.start)
  763. module = sys.modules[__name__]
  764. patcher = patch.object(module, 'function', new=3, autospec=True)
  765. self.assertRaises(TypeError, patcher.start)
  766. def test_autospec_with_object(self):
  767. class Bar(Foo):
  768. extra = []
  769. patcher = patch(foo_name, autospec=Bar)
  770. mock = patcher.start()
  771. try:
  772. self.assertIsInstance(mock, Bar)
  773. self.assertIsInstance(mock.extra, list)
  774. finally:
  775. patcher.stop()
  776. def test_autospec_inherits(self):
  777. FooClass = Foo
  778. patcher = patch(foo_name, autospec=True)
  779. mock = patcher.start()
  780. try:
  781. self.assertIsInstance(mock, FooClass)
  782. self.assertIsInstance(mock(3), FooClass)
  783. finally:
  784. patcher.stop()
  785. def test_autospec_name(self):
  786. patcher = patch(foo_name, autospec=True)
  787. mock = patcher.start()
  788. try:
  789. self.assertIn(" name='Foo'", repr(mock))
  790. self.assertIn(" name='Foo.f'", repr(mock.f))
  791. self.assertIn(" name='Foo()'", repr(mock(None)))
  792. self.assertIn(" name='Foo().f'", repr(mock(None).f))
  793. finally:
  794. patcher.stop()
  795. def test_tracebacks(self):
  796. @patch.object(Foo, 'f', object())
  797. def test():
  798. raise AssertionError
  799. try:
  800. test()
  801. except:
  802. err = sys.exc_info()
  803. result = unittest.TextTestResult(None, None, 0)
  804. traceback = result._exc_info_to_string(err, self)
  805. self.assertIn('raise AssertionError', traceback)
  806. def test_new_callable_patch(self):
  807. patcher = patch(foo_name, new_callable=NonCallableMagicMock)
  808. m1 = patcher.start()
  809. patcher.stop()
  810. m2 = patcher.start()
  811. patcher.stop()
  812. self.assertIsNot(m1, m2)
  813. for mock in m1, m2:
  814. self.assertNotCallable(m1)
  815. def test_new_callable_patch_object(self):
  816. patcher = patch.object(Foo, 'f', new_callable=NonCallableMagicMock)
  817. m1 = patcher.start()
  818. patcher.stop()
  819. m2 = patcher.start()
  820. patcher.stop()
  821. self.assertIsNot(m1, m2)
  822. for mock in m1, m2:
  823. self.assertNotCallable(m1)
  824. def test_new_callable_keyword_arguments(self):
  825. class Bar(object):
  826. kwargs = None
  827. def __init__(self, **kwargs):
  828. Bar.kwargs = kwargs
  829. patcher = patch(foo_name, new_callable=Bar, arg1=1, arg2=2)
  830. m = patcher.start()
  831. try:
  832. self.assertIs(type(m), Bar)
  833. self.assertEqual(Bar.kwargs, dict(arg1=1, arg2=2))
  834. finally:
  835. patcher.stop()
  836. def test_new_callable_spec(self):
  837. class Bar(object):
  838. kwargs = None
  839. def __init__(self, **kwargs):
  840. Bar.kwargs = kwargs
  841. patcher = patch(foo_name, new_callable=Bar, spec=Bar)
  842. patcher.start()
  843. try:
  844. self.assertEqual(Bar.kwargs, dict(spec=Bar))
  845. finally:
  846. patcher.stop()
  847. patcher = patch(foo_name, new_callable=Bar, spec_set=Bar)
  848. patcher.start()
  849. try:
  850. self.assertEqual(Bar.kwargs, dict(spec_set=Bar))
  851. finally:
  852. patcher.stop()
  853. def test_new_callable_create(self):
  854. non_existent_attr = '%s.weeeee' % foo_name
  855. p = patch(non_existent_attr, new_callable=NonCallableMock)
  856. self.assertRaises(AttributeError, p.start)
  857. p = patch(non_existent_attr, new_callable=NonCallableMock,
  858. create=True)
  859. m = p.start()
  860. try:
  861. self.assertNotCallable(m, magic=False)
  862. finally:
  863. p.stop()
  864. def test_new_callable_incompatible_with_new(self):
  865. self.assertRaises(
  866. ValueError, patch, foo_name, new=object(), new_callable=MagicMock
  867. )
  868. self.assertRaises(
  869. ValueError, patch.object, Foo, 'f', new=object(),
  870. new_callable=MagicMock
  871. )
  872. def test_new_callable_incompatible_with_autospec(self):
  873. self.assertRaises(
  874. ValueError, patch, foo_name, new_callable=MagicMock,
  875. autospec=True
  876. )
  877. self.assertRaises(
  878. ValueError, patch.object, Foo, 'f', new_callable=MagicMock,
  879. autospec=True
  880. )
  881. def test_new_callable_inherit_for_mocks(self):
  882. class MockSub(Mock):
  883. pass
  884. MockClasses = (
  885. NonCallableMock, NonCallableMagicMock, MagicMock, Mock, MockSub
  886. )
  887. for Klass in MockClasses:
  888. for arg in 'spec', 'spec_set':
  889. kwargs = {arg: True}
  890. p = patch(foo_name, new_callable=Klass, **kwargs)
  891. m = p.start()
  892. try:
  893. instance = m.return_value
  894. self.assertRaises(AttributeError, getattr, instance, 'x')
  895. finally:
  896. p.stop()
  897. def test_new_callable_inherit_non_mock(self):
  898. class NotAMock(object):
  899. def __init__(self, spec):
  900. self.spec = spec
  901. p = patch(foo_name, new_callable=NotAMock, spec=True)
  902. m = p.start()
  903. try:
  904. self.assertTrue(is_instance(m, NotAMock))
  905. self.assertRaises(AttributeError, getattr, m, 'return_value')
  906. finally:
  907. p.stop()
  908. self.assertEqual(m.spec, Foo)
  909. def test_new_callable_class_decorating(self):
  910. test = self
  911. original = Foo
  912. class SomeTest(object):
  913. def _test(self, mock_foo):
  914. test.assertIsNot(Foo, original)
  915. test.assertIs(Foo, mock_foo)
  916. test.assertIsInstance(Foo, SomeClass)
  917. def test_two(self, mock_foo):
  918. self._test(mock_foo)
  919. def test_one(self, mock_foo):
  920. self._test(mock_foo)
  921. SomeTest = patch(foo_name, new_callable=SomeClass)(SomeTest)
  922. SomeTest().test_one()
  923. SomeTest().test_two()
  924. self.assertIs(Foo, original)
  925. def test_patch_multiple(self):
  926. original_foo = Foo
  927. original_f = Foo.f
  928. original_g = Foo.g
  929. patcher1 = patch.multiple(foo_name, f=1, g=2)
  930. patcher2 = patch.multiple(Foo, f=1, g=2)
  931. for patcher in patcher1, patcher2:
  932. patcher.start()
  933. try:
  934. self.assertIs(Foo, original_foo)
  935. self.assertEqual(Foo.f, 1)
  936. self.assertEqual(Foo.g, 2)
  937. finally:
  938. patcher.stop()
  939. self.assertIs(Foo, original_foo)
  940. self.assertEqual(Foo.f, original_f)
  941. self.assertEqual(Foo.g, original_g)
  942. @patch.multiple(foo_name, f=3, g=4)
  943. def test():
  944. self.assertIs(Foo, original_foo)
  945. self.assertEqual(Foo.f, 3)
  946. self.assertEqual(Foo.g, 4)
  947. test()
  948. def test_patch_multiple_no_kwargs(self):
  949. self.assertRaises(ValueError, patch.multiple, foo_name)
  950. self.assertRaises(ValueError, patch.multiple, Foo)
  951. def test_patch_multiple_create_mocks(self):
  952. original_foo = Foo
  953. original_f = Foo.f
  954. original_g = Foo.g
  955. @patch.multiple(foo_name, f=DEFAULT, g=3, foo=DEFAULT)
  956. def test(f, foo):
  957. self.assertIs(Foo, original_foo)
  958. self.assertIs(Foo.f, f)
  959. self.assertEqual(Foo.g, 3)
  960. self.assertIs(Foo.foo, foo)
  961. self.assertTrue(is_instance(f, MagicMock))
  962. self.assertTrue(is_instance(foo, MagicMock))
  963. test()
  964. self.assertEqual(Foo.f, original_f)
  965. self.assertEqual(Foo.g, original_g)
  966. def test_patch_multiple_create_mocks_different_order(self):
  967. # bug revealed by Jython!
  968. original_f = Foo.f
  969. original_g = Foo.g
  970. patcher = patch.object(Foo, 'f', 3)
  971. patcher.attribute_name = 'f'
  972. other = patch.object(Foo, 'g', DEFAULT)
  973. other.attribute_name = 'g'
  974. patcher.additional_patchers = [other]
  975. @patcher
  976. def test(g):
  977. self.assertIs(Foo.g, g)
  978. self.assertEqual(Foo.f, 3)
  979. test()
  980. self.assertEqual(Foo.f, original_f)
  981. self.assertEqual(Foo.g, original_g)
  982. def test_patch_multiple_stacked_decorators(self):
  983. original_foo = Foo
  984. original_f = Foo.f
  985. original_g = Foo.g
  986. @patch.multiple(foo_name, f=DEFAULT)
  987. @patch.multiple(foo_name, foo=DEFAULT)
  988. @patch(foo_name + '.g')
  989. def test1(g, **kwargs):
  990. _test(g, **kwargs)
  991. @patch.multiple(foo_name, f=DEFAULT)
  992. @patch(foo_name + '.g')
  993. @patch.multiple(foo_name, foo=DEFAULT)
  994. def test2(g, **kwargs):
  995. _test(g, **kwargs)
  996. @patch(foo_name + '.g')
  997. @patch.multiple(foo_name, f=DEFAULT)
  998. @patch.multiple(foo_name, foo=DEFAULT)
  999. def test3(g, **kwargs):
  1000. _test(g, **kwargs)
  1001. def _test(g, **kwargs):
  1002. f = kwargs.pop('f')
  1003. foo = kwargs.pop('foo')
  1004. self.assertFalse(kwargs)
  1005. self.assertIs(Foo, original_foo)
  1006. self.assertIs(Foo.f, f)
  1007. self.assertIs(Foo.g, g)
  1008. self.assertIs(Foo.foo, foo)
  1009. self.assertTrue(is_instance(f, MagicMock))
  1010. self.assertTrue(is_instance(g, MagicMock))
  1011. self.assertTrue(is_instance(foo, MagicMock))
  1012. test1()
  1013. test2()
  1014. test3()
  1015. self.assertEqual(Foo.f, original_f)
  1016. self.assertEqual(Foo.g, original_g)
  1017. def test_patch_multiple_create_mocks_patcher(self):
  1018. original_foo = Foo
  1019. original_f = Foo.f
  1020. original_g = Foo.g
  1021. patcher = patch.multiple(foo_name, f=DEFAULT, g=3, foo=DEFAULT)
  1022. result = patcher.start()
  1023. try:
  1024. f = result['f']
  1025. foo = result['foo']
  1026. self.assertEqual(set(result), set(['f', 'foo']))
  1027. self.assertIs(Foo, original_foo)
  1028. self.assertIs(Foo.f, f)
  1029. self.assertIs(Foo.foo, foo)
  1030. self.assertTrue(is_instance(f, MagicMock))
  1031. self.assertTrue(is_instance(foo, MagicMock))
  1032. finally:
  1033. patcher.stop()
  1034. self.assertEqual(Foo.f, original_f)
  1035. self.assertEqual(Foo.g, original_g)
  1036. def test_patch_multiple_decorating_class(self):
  1037. test = self
  1038. original_foo = Foo
  1039. original_f = Foo.f
  1040. original_g = Foo.g
  1041. class SomeTest(object):
  1042. def _test(self, f, foo):
  1043. test.assertIs(Foo, original_foo)
  1044. test.assertIs(Foo.f, f)
  1045. test.assertEqual(Foo.g, 3)
  1046. test.assertIs(Foo.foo, foo)
  1047. test.assertTrue(is_instance(f, MagicMock))
  1048. test.assertTrue(is_instance(foo, MagicMock))
  1049. def test_two(self, f, foo):
  1050. self._test(f, foo)
  1051. def test_one(self, f, foo):
  1052. self._test(f, foo)
  1053. SomeTest = patch.multiple(
  1054. foo_name, f=DEFAULT, g=3, foo=DEFAULT
  1055. )(SomeTest)
  1056. thing = SomeTest()
  1057. thing.test_one()
  1058. thing.test_two()
  1059. self.assertEqual(Foo.f, original_f)
  1060. self.assertEqual(Foo.g, original_g)
  1061. def test_patch_multiple_create(self):
  1062. patcher = patch.multiple(Foo, blam='blam')
  1063. self.assertRaises(AttributeError, patcher.start)
  1064. patcher = patch.multiple(Foo, blam='blam', create=True)
  1065. patcher.start()
  1066. try:
  1067. self.assertEqual(Foo.blam, 'blam')
  1068. finally:
  1069. patcher.stop()
  1070. self.assertFalse(hasattr(Foo, 'blam'))
  1071. def test_patch_multiple_spec_set(self):
  1072. # if spec_set works then we can assume that spec and autospec also
  1073. # work as the underlying machinery is the same
  1074. patcher = patch.multiple(Foo, foo=DEFAULT, spec_set=['a', 'b'])
  1075. result = patcher.start()
  1076. try:
  1077. self.assertEqual(Foo.foo, result['foo'])
  1078. Foo.foo.a(1)
  1079. Foo.foo.b(2)
  1080. Foo.foo.a.assert_called_with(1)
  1081. Foo.foo.b.assert_called_with(2)
  1082. self.assertRaises(AttributeError, setattr, Foo.foo, 'c', None)
  1083. finally:
  1084. patcher.stop()
  1085. def test_patch_multiple_new_callable(self):
  1086. class Thing(object):
  1087. pass
  1088. patcher = patch.multiple(
  1089. Foo, f=DEFAULT, g=DEFAULT, new_callable=Thing
  1090. )
  1091. result = patcher.start()
  1092. try:
  1093. self.assertIs(Foo.f, result['f'])
  1094. self.assertIs(Foo.g, result['g'])
  1095. self.assertIsInstance(Foo.f, Thing)
  1096. self.assertIsInstance(Foo.g, Thing)
  1097. self.assertIsNot(Foo.f, Foo.g)
  1098. finally:
  1099. patcher.stop()
  1100. def test_nested_patch_failure(self):
  1101. original_f = Foo.f
  1102. original_g = Foo.g
  1103. @patch.object(Foo, 'g', 1)
  1104. @patch.object(Foo, 'missing', 1)
  1105. @patch.object(Foo, 'f', 1)
  1106. def thing1():
  1107. pass
  1108. @patch.object(Foo, 'missing', 1)
  1109. @patch.object(Foo, 'g', 1)
  1110. @patch.object(Foo, 'f', 1)
  1111. def thing2():
  1112. pass
  1113. @patch.object(Foo, 'g', 1)
  1114. @patch.object(Foo, 'f', 1)
  1115. @patch.object(Foo, 'missing', 1)
  1116. def thing3():
  1117. pass
  1118. for func in thing1, thing2, thing3:
  1119. self.assertRaises(AttributeError, func)
  1120. self.assertEqual(Foo.f, original_f)
  1121. self.assertEqual(Foo.g, original_g)
  1122. def test_new_callable_failure(self):
  1123. original_f = Foo.f
  1124. original_g = Foo.g
  1125. original_foo = Foo.foo
  1126. def crasher():
  1127. raise NameError('crasher')
  1128. @patch.object(Foo, 'g', 1)
  1129. @patch.object(Foo, 'foo', new_callable=crasher)
  1130. @patch.object(Foo, 'f', 1)
  1131. def thing1():
  1132. pass
  1133. @patch.object(Foo, 'foo', new_callable=crasher)
  1134. @patch.object(Foo, 'g', 1)
  1135. @patch.object(Foo, 'f', 1)
  1136. def thing2():
  1137. pass
  1138. @patch.object(Foo, 'g', 1)
  1139. @patch.object(Foo, 'f', 1)
  1140. @patch.object(Foo, 'foo', new_callable=crasher)
  1141. def thing3():
  1142. pass
  1143. for func in thing1, thing2, thing3:
  1144. self.assertRaises(NameError, func)
  1145. self.assertEqual(Foo.f, original_f)
  1146. self.assertEqual(Foo.g, original_g)
  1147. self.assertEqual(Foo.foo, original_foo)
  1148. def test_patch_multiple_failure(self):
  1149. original_f = Foo.f
  1150. original_g = Foo.g
  1151. patcher = patch.object(Foo, 'f', 1)
  1152. patcher.attribute_name = 'f'
  1153. good = patch.object(Foo, 'g', 1)
  1154. good.attribute_name = 'g'
  1155. bad = patch.object(Foo, 'missing', 1)
  1156. bad.attribute_name = 'missing'
  1157. for additionals in [good, bad], [bad, good]:
  1158. patcher.additional_patchers = additionals
  1159. @patcher
  1160. def func():
  1161. pass
  1162. self.assertRaises(AttributeError, func)
  1163. self.assertEqual(Foo.f, original_f)
  1164. self.assertEqual(Foo.g, original_g)
  1165. def test_patch_multiple_new_callable_failure(self):
  1166. original_f = Foo.f
  1167. original_g = Foo.g
  1168. original_foo = Foo.foo
  1169. def crasher():
  1170. raise NameError('crasher')
  1171. patcher = patch.object(Foo, 'f', 1)
  1172. patcher.attribute_name = 'f'
  1173. good = patch.object(Foo, 'g', 1)
  1174. good.attribute_name = 'g'
  1175. bad = patch.object(Foo, 'foo', new_callable=crasher)
  1176. bad.attribute_name = 'foo'
  1177. for additionals in [good, bad], [bad, good]:
  1178. patcher.additional_patchers = additionals
  1179. @patcher
  1180. def func():
  1181. pass
  1182. self.assertRaises(NameError, func)
  1183. self.assertEqual(Foo.f, original_f)
  1184. self.assertEqual(Foo.g, original_g)
  1185. self.assertEqual(Foo.foo, original_foo)
  1186. def test_patch_multiple_string_subclasses(self):
  1187. Foo = type('Foo', (str,), {'fish': 'tasty'})
  1188. foo = Foo()
  1189. @patch.multiple(foo, fish='nearly gone')
  1190. def test():
  1191. self.assertEqual(foo.fish, 'nearly gone')
  1192. test()
  1193. self.assertEqual(foo.fish, 'tasty')
  1194. @patch('unittest.mock.patch.TEST_PREFIX', 'foo')
  1195. def test_patch_test_prefix(self):
  1196. class Foo(object):
  1197. thing = 'original'
  1198. def foo_one(self):
  1199. return self.thing
  1200. def foo_two(self):
  1201. return self.thing
  1202. def test_one(self):
  1203. return self.thing
  1204. def test_two(self):
  1205. return self.thing
  1206. Foo = patch.object(Foo, 'thing', 'changed')(Foo)
  1207. foo = Foo()
  1208. self.assertEqual(foo.foo_one(), 'changed')
  1209. self.assertEqual(foo.foo_two(), 'changed')
  1210. self.assertEqual(foo.test_one(), 'original')
  1211. self.assertEqual(foo.test_two(), 'original')
  1212. @patch('unittest.mock.patch.TEST_PREFIX', 'bar')
  1213. def test_patch_dict_test_prefix(self):
  1214. class Foo(object):
  1215. def bar_one(self):
  1216. return dict(the_dict)
  1217. def bar_two(self):
  1218. return dict(the_dict)
  1219. def test_one(self):
  1220. return dict(the_dict)
  1221. def test_two(self):
  1222. return dict(the_dict)
  1223. the_dict = {'key': 'original'}
  1224. Foo = patch.dict(the_dict, key='changed')(Foo)
  1225. foo =Foo()
  1226. self.assertEqual(foo.bar_one(), {'key': 'changed'})
  1227. self.assertEqual(foo.bar_two(), {'key': 'changed'})
  1228. self.assertEqual(foo.test_one(), {'key': 'original'})
  1229. self.assertEqual(foo.test_two(), {'key': 'original'})
  1230. def test_patch_with_spec_mock_repr(self):
  1231. for arg in ('spec', 'autospec', 'spec_set'):
  1232. p = patch('%s.SomeClass' % __name__, **{arg: True})
  1233. m = p.start()
  1234. try:
  1235. self.assertIn(" name='SomeClass'", repr(m))
  1236. self.assertIn(" name='SomeClass.class_attribute'",
  1237. repr(m.class_attribute))
  1238. self.assertIn(" name='SomeClass()'", repr(m()))
  1239. self.assertIn(" name='SomeClass().class_attribute'",
  1240. repr(m().class_attribute))
  1241. finally:
  1242. p.stop()
  1243. def test_patch_nested_autospec_repr(self):
  1244. with patch('unittest.test.testmock.support', autospec=True) as m:
  1245. self.assertIn(" name='support.SomeClass.wibble()'",
  1246. repr(m.SomeClass.wibble()))
  1247. self.assertIn(" name='support.SomeClass().wibble()'",
  1248. repr(m.SomeClass().wibble()))
  1249. def test_mock_calls_with_patch(self):
  1250. for arg in ('spec', 'autospec', 'spec_set'):
  1251. p = patch('%s.SomeClass' % __name__, **{arg: True})
  1252. m = p.start()
  1253. try:
  1254. m.wibble()
  1255. kalls = [call.wibble()]
  1256. self.assertEqual(m.mock_calls, kalls)
  1257. self.assertEqual(m.method_calls, kalls)
  1258. self.assertEqual(m.wibble.mock_calls, [call()])
  1259. result = m()
  1260. kalls.append(call())
  1261. self.assertEqual(m.mock_calls, kalls)
  1262. result.wibble()
  1263. kalls.append(call().wibble())
  1264. self.assertEqual(m.mock_calls, kalls)
  1265. self.assertEqual(result.mock_calls, [call.wibble()])
  1266. self.assertEqual(result.wibble.mock_calls, [call()])
  1267. self.assertEqual(result.method_calls, [call.wibble()])
  1268. finally:
  1269. p.stop()
  1270. def test_patch_imports_lazily(self):
  1271. p1 = patch('squizz.squozz')
  1272. self.assertRaises(ImportError, p1.start)
  1273. with uncache('squizz'):
  1274. squizz = Mock()
  1275. sys.modules['squizz'] = squizz
  1276. squizz.squozz = 6
  1277. p1 = patch('squizz.squozz')
  1278. squizz.squozz = 3
  1279. p1.start()
  1280. p1.stop()
  1281. self.assertEqual(squizz.squozz, 3)
  1282. def test_patch_propogrates_exc_on_exit(self):
  1283. class holder:
  1284. exc_info = None, None, None
  1285. class custom_patch(_patch):
  1286. def __exit__(self, etype=None, val=None, tb=None):
  1287. _patch.__exit__(self, etype, val, tb)
  1288. holder.exc_info = etype, val, tb
  1289. stop = __exit__
  1290. def with_custom_patch(target):
  1291. getter, attribute = _get_target(target)
  1292. return custom_patch(
  1293. getter, attribute, DEFAULT, None, False, None,
  1294. None, None, {}
  1295. )
  1296. @with_custom_patch('squizz.squozz')
  1297. def test(mock):
  1298. raise RuntimeError
  1299. with uncache('squizz'):
  1300. squizz = Mock()
  1301. sys.modules['squizz'] = squizz
  1302. self.assertRaises(RuntimeError, test)
  1303. self.assertIs(holder.exc_info[0], RuntimeError)
  1304. self.assertIsNotNone(holder.exc_info[1],
  1305. 'exception value not propgated')
  1306. self.assertIsNotNone(holder.exc_info[2],
  1307. 'exception traceback not propgated')
  1308. def test_create_and_specs(self):
  1309. for kwarg in ('spec', 'spec_set', 'autospec'):
  1310. p = patch('%s.doesnotexist' % __name__, create=True,
  1311. **{kwarg: True})
  1312. self.assertRaises(TypeError, p.start)
  1313. self.assertRaises(NameError, lambda: doesnotexist)
  1314. # check that spec with create is innocuous if the original exists
  1315. p = patch(MODNAME, create=True, **{kwarg: True})
  1316. p.start()
  1317. p.stop()
  1318. def test_multiple_specs(self):
  1319. original = PTModule
  1320. for kwarg in ('spec', 'spec_set'):
  1321. p = patch(MODNAME, autospec=0, **{kwarg: 0})
  1322. self.assertRaises(TypeError, p.start)
  1323. self.assertIs(PTModule, original)
  1324. for kwarg in ('spec', 'autospec'):
  1325. p = patch(MODNAME, spec_set=0, **{kwarg: 0})
  1326. self.assertRaises(TypeError, p.start)
  1327. self.assertIs(PTModule, original)
  1328. for kwarg in ('spec_set', 'autospec'):
  1329. p = patch(MODNAME, spec=0, **{kwarg: 0})
  1330. self.assertRaises(TypeError, p.start)
  1331. self.assertIs(PTModule, original)
  1332. def test_specs_false_instead_of_none(self):
  1333. p = patch(MODNAME, spec=False, spec_set=False, autospec=False)
  1334. mock = p.start()
  1335. try:
  1336. # no spec should have been set, so attribute access should not fail
  1337. mock.does_not_exist
  1338. mock.does_not_exist = 3
  1339. finally:
  1340. p.stop()
  1341. def test_falsey_spec(self):
  1342. for kwarg in ('spec', 'autospec', 'spec_set'):
  1343. p = patch(MODNAME, **{kwarg: 0})
  1344. m = p.start()
  1345. try:
  1346. self.assertRaises(AttributeError, getattr, m, 'doesnotexit')
  1347. finally:
  1348. p.stop()
  1349. def test_spec_set_true(self):
  1350. for kwarg in ('spec', 'autospec'):
  1351. p = patch(MODNAME, spec_set=True, **{kwarg: True})
  1352. m = p.start()
  1353. try:
  1354. self.assertRaises(AttributeError, setattr, m,
  1355. 'doesnotexist', 'something')
  1356. self.assertRaises(AttributeError, getattr, m, 'doesnotexist')
  1357. finally:
  1358. p.stop()
  1359. def test_callable_spec_as_list(self):
  1360. spec = ('__call__',)
  1361. p = patch(MODNAME, spec=spec)
  1362. m = p.start()
  1363. try:
  1364. self.assertTrue(callable(m))
  1365. finally:
  1366. p.stop()
  1367. def test_not_callable_spec_as_list(self):
  1368. spec = ('foo', 'bar')
  1369. p = patch(MODNAME, spec=spec)
  1370. m = p.start()
  1371. try:
  1372. self.assertFalse(callable(m))
  1373. finally:
  1374. p.stop()
  1375. def test_patch_stopall(self):
  1376. unlink = os.unlink
  1377. chdir = os.chdir
  1378. path = os.path
  1379. patch('os.unlink', something).start()
  1380. patch('os.chdir', something_else).start()
  1381. @patch('os.path')
  1382. def patched(mock_path):
  1383. patch.stopall()
  1384. self.assertIs(os.path, mock_path)
  1385. self.assertIs(os.unlink, unlink)
  1386. self.assertIs(os.chdir, chdir)
  1387. patched()
  1388. self.assertIs(os.path, path)
  1389. def test_stopall_lifo(self):
  1390. stopped = []
  1391. class thing(object):
  1392. one = two = three = None
  1393. def get_patch(attribute):
  1394. class mypatch(_patch):
  1395. def stop(self):
  1396. stopped.append(attribute)
  1397. return super(mypatch, self).stop()
  1398. return mypatch(lambda: thing, attribute, None, None,
  1399. False, None, None, None, {})
  1400. [get_patch(val).start() for val in ("one", "two", "three")]
  1401. patch.stopall()
  1402. self.assertEqual(stopped, ["three", "two", "one"])
  1403. def test_special_attrs(self):
  1404. def foo(x=0):
  1405. """TEST"""
  1406. return x
  1407. with patch.object(foo, '__defaults__', (1, )):
  1408. self.assertEqual(foo(), 1)
  1409. self.assertEqual(foo(), 0)
  1410. with patch.object(foo, '__doc__', "FUN"):
  1411. self.assertEqual(foo.__doc__, "FUN")
  1412. self.assertEqual(foo.__doc__, "TEST")
  1413. with patch.object(foo, '__module__', "testpatch2"):
  1414. self.assertEqual(foo.__module__, "testpatch2")
  1415. self.assertEqual(foo.__module__, 'unittest.test.testmock.testpatch')
  1416. with patch.object(foo, '__annotations__', dict([('s', 1, )])):
  1417. self.assertEqual(foo.__annotations__, dict([('s', 1, )]))
  1418. self.assertEqual(foo.__annotations__, dict())
  1419. def foo(*a, x=0):
  1420. return x
  1421. with patch.object(foo, '__kwdefaults__', dict([('x', 1, )])):
  1422. self.assertEqual(foo(), 1)
  1423. self.assertEqual(foo(), 0)
  1424. if __name__ == '__main__':
  1425. unittest.main()