Как смоделировать неинициализированную глобальную переменную? - PullRequest
0 голосов
/ 13 апреля 2020

В моем модуле есть неинициализированная глобальная переменная, которая правильно инициализируется при запуске приложения. Для проверки типов я использую синтаксис var: Type без значения python> = 3.6, поэтому мне не нужно усложнять проверку типов для значения по умолчанию (которое будет None).

Теперь я хочу выполнить юнит-тестирование другой функции, которая использует эту глобальную переменную, но я получаю ошибку от unittest.mock.patch. Вот упрощенная версия того, что я делаю:

  • Файл mod.py:
global_var: bool
#global_var: bool = False
def init(val: bool) -> None:
    global global_var
    global_var = val
def do_stuff() -> str:
    return "a" if global_var else "b"
  • Файл test.py:
import unittest.mock, mod
class MockUninitializedGlobal(unittest.TestCase):
    def test_it(self):
        with unittest.mock.patch("mod.global_var", True):
            actual = mod.do_stuff()
        expected = "a"
        self.assertEqual(expected, actual)
  • Я запускаю его с python3 -m unittest test.py.

Исключение составляет

Traceback (most recent call last):
  File "/home/luc/soquestion/test.py", line 4, in test_it
    with mock.patch("mod.global_var", True):
  File "/nix/store/vs4vj1yzqj1bkcqkf3b6sxm6jfy1gb4j-python3-3.7.7/lib/python3.7/unittest/mock.py", line 1323, in __enter__
    original, local = self.get_original()
  File "/nix/store/vs4vj1yzqj1bkcqkf3b6sxm6jfy1gb4j-python3-3.7.7/lib/python3.7/unittest/mock.py", line 1297, in get_original
    "%s does not have the attribute %r" % (target, name)
AttributeError: <module 'mod' from '/home/luc/soquestion/mod.py'> does not have the attribute 'global_var'

Если я комментирую строку 1 и раскомментирую строку 2 в моде .py тест пройден.

Можно ли как-нибудь сделать тест без определения значения по умолчанию для глобальной переменной в коде моего приложения?

...