Найти - Пользователи
Полная версия: 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__?
miabrown123
Зарегистрирован: 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__?
Офлайн
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