Найти - Пользователи
Полная версия: Unittest Mocking глобальной переменной в модуле
Начало » Python для новичков » Unittest Mocking глобальной переменной в модуле
1
ZZ-ZZ
Доброго времени! В джанго проекте есть глобальная переменная, связанная с БД. Можно ли ее подменить таким образом, что бы в тестах ее __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__ в тесте? Может быть, есть более правильные способы объявления переменной базы данных, что бы не было таких проблем?
ZerG
можно
но вы явно не понимаетет структуру дженги
Либо берите как есть
либо своими
И так и так правильно
ZZ-ZZ
можно
Спасибо! )
А как переписать тест, что бы протестировать main.main(), и при этом не запускался LongTimeExecutingClass.__init__?
learntune
Миграции - это способ Django распространять изменения, которые вы вносите в свои модели (добавление поля, удаление модели и т. д.), в схему вашей базы данных.
drift hunters
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB