как смоделировать один модуль в пакете в Python - PullRequest
0 голосов
/ 26 февраля 2019

TL; DR: Как смоделировать отдельный модуль из пакета Python

Подробное описание :

Мы используем Beaglebone на основе черногодоска и у нас есть разные репозитории git, содержащие разные скрипты / модули Python.Сейчас в большинстве репозиториев мы поддерживаем модульный тест для скрипта / модулей, и, когда скрипт / модуль зависит от другого модуля, мы высмеиваем модуль.

Во время написания unittest я столкнулся с проблемой, что у меня есть пакеты вкакой модуль присутствует, в то время как другой модуль копируется из другого репозитория при создании кросс-скомпилированных rfs.

Описание проблемы
Я создал примерную структуру модуля, как у меня в исходном проекте.

ankur@:~/temp/python/mock_test $ tree
.
├── __init__.py
├── mock_hi.py
├── orig_script.py
├── test_orig_file.py
└── tools
    ├── hello.py
    └── __init__.py

в приведенной выше структуре

  1. orig_script.py: основной скрипт
  2. test_orig_file.py: файл модульного теста для основного скрипта
  3. tools: каталог пакетов, содержащий различные пакеты, такие как hello и hi
  4. mock_hi.py: макет пакета hi из пакета инструментов.

содержимое файла orig_script.py

#/usr/bin/env python

from tools import hello
from tools import hi

def all_greentings():
    hello.world()
    hi.there()
    pass


# stuff to run always here such as class/def
def main():
    all_greentings()
    pass

if __name__ == "__main__":
   # stuff only to run when not called via 'import' here
   main()

содержимое файла test_orig_file.py

#!/usr/bin/env python
import unittest
import orig_script
from mock_hi import hi, there

class orig_test_class(unittest.TestCase):

    def test_hi_mock(self):
        orig_script.all_greentings()
        print("Done!")

содержимое mock_hi.py

#!/usr/bin/env python

import sys
import types
from mock import Mock

# mocking  module.
mn = 'tools.hi'
m_obj = types.ModuleType(mn)
sys.modules[mn] = m_obj
m_obj.there = Mock(name=mn+'.there')

содержимое tools / hello.py выглядит следующим образом

#/usr/bin/env python

def world():
    print("Hello, World!")


if __name__ == "__main__":
   # stuff only to run when not called via 'import' here
   world()

Когда я запускаю unittest, я получаю следующую ошибку

ankur@:~/temp/python/mock_test $ python -m unittest orig_script.py 
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module>
    main(module=None)
  File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs
    self.createTests()
  File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests
    self.module)
  File "/usr/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName
    module = __import__('.'.join(parts_copy))
  File "orig_script.py", line 4, in <module>
    from tools import hi
ImportError: cannot import name hi

Любые предложения / исправления / указатели, чтобы это заработало?

...