This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: fail to mock the urlopen function
Type: Stage:
Components: Library (Lib) Versions: Python 3.6, Python 3.3, Python 3.4, Python 3.5
process
Status: closed Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: r.david.murray, sih4sing5hong5
Priority: normal Keywords:

Created on 2015-08-13 06:56 by sih4sing5hong5, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (4)
msg248500 - (view) Author: sih4sing5hong5 (sih4sing5hong5) * Date: 2015-08-13 06:56
I also posted in stackoverflow: http://stackoverflow.com/questions/30978207/python-urlopen-mock-fail

```
from unittest.mock import patch
import urllib
from urllib import request
from urllib.request import urlopen

@patch('urllib.request.urlopen')
def openPatch(urlopenMock):
    print(urlopenMock)
    print(urlopen)
    print(request.urlopen)
    print(urllib.request.urlopen)

openPatch()
```
and got

```
<MagicMock name='urlopen' id='140645541554384'>
<function urlopen at 0x7fea9764c268>
<MagicMock name='urlopen' id='140645541554384'>
<MagicMock name='urlopen' id='140645541554384'>
```
request.urlopen and urllib.request.urlopen worked. Why urlopen had been not mocked?
msg248505 - (view) Author: sih4sing5hong5 (sih4sing5hong5) * Date: 2015-08-13 08:45
It is normal because of __all__ syntax.

By:
https://github.com/testing-cabal/mock/issues/313#issuecomment-130564364
msg248518 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2015-08-13 12:15
It has nothing to do with __all__, and everything to do with the way namespaces work in Python.  'from urllib.request import urllib' creates a name 'urllib' in the global namespace of your module pointing to the urlopen function (*before* you do your patch), and patch has no effect on the global namespace of your module, only on the global namespace of urllib.request.  By contrast, urllib in your module's global namespace points to the urllib module, so urllib.request points to the urllib.request's global namespace, which patch has altered to point to your mock by the time you print its value.
msg248682 - (view) Author: sih4sing5hong5 (sih4sing5hong5) * Date: 2015-08-16 13:02
I moved the import urlopen inside the patch.
The mock worked.

Thank you for explanations. I understand now.
History
Date User Action Args
2022-04-11 14:58:19adminsetgithub: 69043
2015-08-16 13:02:57sih4sing5hong5setmessages: + msg248682
2015-08-13 12:15:03r.david.murraysetnosy: + r.david.murray
messages: + msg248518
2015-08-13 08:45:44sih4sing5hong5setstatus: open -> closed

messages: + msg248505
2015-08-13 06:56:17sih4sing5hong5create