Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 24, 2024 19:58:21

ZZ-ZZ
Зарегистрирован: 2024-01-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Unittest Mocking глобальной переменной в модуле

Доброго времени! В джанго проекте есть глобальная переменная, связанная с БД. Можно ли ее подменить таким образом, что бы в тестах ее __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()

модуль 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__?

Офлайн

#4 Янв. 26, 2024 11:53:51

learntune
От: United States
Зарегистрирован: 2024-01-26
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Unittest Mocking глобальной переменной в модуле

Миграции - это способ Django распространять изменения, которые вы вносите в свои модели (добавление поля, удаление модели и т. д.), в схему вашей базы данных.
drift hunters

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version