Форум сайта python.su
Схематическое изложение (ибо всё секретно )
имеется модуль, который нужно протестировать - “master_module.py”:
# different imports, path patches, etc... ... from clients import WebAPIClient from utils.conf import config class WebClient(object): def __init__(self): conf = config.get_config('web') self.__client = WebAPIClient(host=conf['master_service.host'],\ user=conf['master_service.user'], \ password=conf['master_service.password']) .... # different methods ....
sys.modules['utils.conf'] = Mock() from master_module import WebClient config = Mock() config.get_config = Mock(return_value={'master_service.host':'mock_host', 'master_service.user':'mock_user', 'corpus_api.password':'mock_pass'}) print config.get_config()
client = WebClient()
Traceback .... bla-bla .... in __init__ host=conf['master_service.host'], \ TypeError: 'Mock' object is unsubscriptable
import clients globals()['clients'].config = config # assign mocked config
Отредактировано Master_Sergius (Дек. 23, 2015 21:01:52)
Офлайн
Master_SergiusНадо патчить прямо в том модуле.
Возможно, есть более элегантное решение?
from utils.conf import config
Офлайн
py.user.next
Надо патчить прямо в том модуле.
from utils.conf import config
Офлайн
Master_SergiusНе дописывать, а использовать patch().
В смысле? Дописывать что-то в другой модуль?
>>> from unittest.mock import patch >>> >>> p = patch('os.path.join') >>> p.start() <MagicMock name='join' id='3073445324'> >>> >>> import os >>> >>> os.path.join('x') <MagicMock name='join()' id='3073462732'> >>> >>> p.stop() >>>
#!/usr/bin/env python3 import os def main(): print('hello') print(os.path.join('x', 'y')) if __name__ == '__main__': main()
#!/usr/bin/env python3 from unittest.mock import patch import t p = patch('os.path.join') p.start() t.main() p.stop()
[guest@localhost py]$ ./t.py
hello
x/y
[guest@localhost py]$ ./u.py
hello
<MagicMock name='join()' id='3073278892'>
[guest@localhost py]$
Отредактировано py.user.next (Дек. 24, 2015 11:45:28)
Офлайн