Форум сайта python.su
Доброго времени! В джанго проекте есть глобальная переменная, связанная с БД. Можно ли ее подменить таким образом, что бы в тестах ее __init__ метод не срабатывал?
Экстракт проблемы выкладываю:
модуль main.py:
import long_time_module as l def main(): print('Executing main function') def optional(): l.ltc.print_ok() if __name__ == '__main__': main() optional()
class LongTimeExecutingClass(): def __init__(self) -> None: print('LongTimeExecutingClass - Long, Long init') def print_ok(self)->None: print ('LongTimeExecutingClass - print ok') ltc = LongTimeExecutingClass()
from unittest import TestCase from unittest.mock import patch class MyClass(): def __init__(self) -> None: print('Mocking init') def print_ok(self) -> None: print ('Mocking class - print ok') class TestAll(TestCase): @patch('main.l.ltc', MyClass(), spec=False) def test_main(self): import main main.main() main.optional() assert True
def test_main(self): import main main.l.ltc = MyClass() main.main() main.optional() assert True
Отредактировано ZZ-ZZ (Янв. 24, 2024 20:00:27)
Офлайн
можно
но вы явно не понимаетет структуру дженги
Либо берите как есть
либо своими
И так и так правильно
Офлайн
можноСпасибо! )
Офлайн
Зарегистрирован: 2024-01-24
Сообщения: 2
Репутация: + 0 -
Профиль Отправить e-mail
Unittest Mocking глобальной переменной в модуле
Доброго времени! В джанго проекте есть глобальная переменная, связанная с БД. Можно ли ее подменить таким образом, что бы в тестах ее __init__ метод не срабатывал?
Экстракт проблемы выкладываю:
модуль main.py:
import long_time_module as l horror games
def main():
print('Executing main function')
def optional():
l.ltc.print_ok()
if __name__ == ‘__main__’:
main()
optional()
модуль long_time_module.py:
class LongTimeExecutingClass():
def __init__(self) -> None:
print('LongTimeExecutingClass - Long, Long init')
def print_ok(self)->None:
print ('LongTimeExecutingClass - print ok')
ltc = LongTimeExecutingClass()
модуль tests.py:
from unittest import TestCase
from unittest.mock import patch
class MyClass():
def __init__(self) -> None:
print('Mocking init')
def print_ok(self) -> None:
print ('Mocking class - print ok')
class TestAll(TestCase):
@patch('main.l.ltc', MyClass(), spec=False)
def test_main(self):
import main
main.main()
main.optional()
assert True
Сейчас при запуске загружается модуль main, из него тянется long_time_module и срабатывает LongTimeExecutingClass.__init__ метод. После этого в тесте LongTimeExecutingClass подменяется MyClass и дальше все работает правильно. Простое присвоение переменной в тесте:
def test_main(self):
import main
main.l.ltc = MyClass()
main.main()
main.optional()
assert True
ожидаемо приводит к такому же результату.
Можно ли заблокировать LongTimeExecutingClass.__init__ в тесте? Может быть, есть более правильные способы объявления переменной базы данных, что бы не было таких проблем?
Отредактировано ZZ-ZZ (Янв. 24, 2024 20:00:27)
Офлайн
Пожаловаться | Цитировать
#2 Янв. 24, 2024 21:43:20
ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: + 61 -
Профиль Отправить e-mail
Unittest Mocking глобальной переменной в модуле
можно
но вы явно не понимаетет структуру дженги
Либо берите как есть
либо своими
И так и так правильно
Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Офлайн
Пожаловаться | Цитировать
#3 Янв. 25, 2024 18:32:00
ZZ-ZZ
Зарегистрирован: 2024-01-24
Сообщения: 2
Репутация: + 0 -
Профиль Отправить e-mail
Unittest Mocking глобальной переменной в модуле
можно
Спасибо! )
А как переписать тест, что бы протестировать main.main(), и при этом не запускался LongTimeExecutingClass.__init__?
Офлайн
Офлайн