Модульный тест Python - модуль, если оператор не определен - PullRequest
0 голосов
/ 12 мая 2018

У меня есть файл Python, который я хочу проверить (my_code.py):

import some_module
if some_module.DO_IMPORT:
   import other_module

def my_func(self):
   print(some_module.DO_IMPORT)
   if some_module.DO_IMPORT:
      print(other_module.OTHER_VAR)
      return true
   return false

Вот мой тестовый класс (test_my_code.py):

from unittest.mock import patch, Mock
import my_code

class TestMyCode(self):

   @patch('my_code.other_module', OTHER_VAR='Other Var')
   @patch('my_code.some_module', DO_IMPORT=True)
   def_test_my_func(self, *_):
      ret = my_code.my_func()
      self.assertTrue(ret)

Это выдает ошибку:

NameError: name 'other_module' is not defined

Даже если я пропатчил some_module.DO_IMPORT, чтобы вернуть True, он не импортирует other_module. (Я уверен в этом, потому что some_module.DO_IMPORT печатает True). Фактическое значение some_module.DO_IMPORT установлено в False. Я могу исправить это, но импорт не работает. Как заставить это работать?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Альтернативой является выполнение import my_code после того, как mock_do_import установлено на True, с минимальной областью действия.

import unittest
import mock


class TestMyCode(unittest.TestCase):

    @mock.patch('python2_unittests.lib.app.OTHER_VAR')
    @mock.patch('python2_unittests.lib.remove3.DO_IMPORT')
    def test_my_func(self, mock_import, mock_other):
        mock_import.return_value = True
        mock_other.return_value = 'others'
        from python2_unittests.lib import my_code
        ret = my_code.my_func()
        self.assertTrue(ret)
0 голосов
/ 12 мая 2018

Вместо использования unittest для monkey-patch some_module.DO_IMPORT, вы можете просто изменить его непосредственно перед импортом модуля, который вы хотите протестировать:

from unittest.mock import patch, Mock
import some_module
some_module.DO_IMPORT = True
import my_code
# then do the test
...