Я пытаюсь высмеять os.environ
внутри класса, но я просто не могу понять это правильно. Вот моя структура:Python mock os.environ, используемый внутри класса
#file.py
import os
class MyClass():
connection_url = os.environ['DB']
#some code
А вот мой тест (последняя попытка, так или иначе):
#test.py
from unittest import TestCase
from unittest.mock import patch
from file import MyClass
class TestMyClass(TestCase):
@patch.dict('file.os.environ', {'DB' : 'Dummy' })
def setUp(self):
self.class = MyClass()
#some testing
Это провал с треском, поднимая KeyError 'DB' ... Может кто-нибудь мне помочь? Я новичок в python unittesting. Я исследовал некоторые блоги и stackoverflow, пробовал некоторые решения, но не мог понять.
Заранее благодарен!
Я думаю, что это латание неправильного места, потому что 'os.environ [» DB '] 'все равно будет доступен (и, возможно,« KeyError », если он не настроен в тестовом env). Я имею в виду, что код OP увеличивается во время импорта не во время настройки, поэтому этот патч не поможет. – wim
@wim - Абсолютно. Проблема в том, что вы _can't_ действительно исправляете что-то во время импорта. Все, что вы можете сделать, это патч объекта, когда вы собираетесь его использовать. Это заменит любое значение, которое имеет значение 'connection_url', с фиктивным значением, которое хочет OP. Как вы отмечаете, это не мешает «KeyError», если «DB» не находится в среде. Единственный способ - это _set_ 'os.environ' перед импортом какого-либо кода или путем изменения не-тестовый код ... – mgilson
Следовательно, этот ответ не очень полезен. Как только какой-либо метод тестирования попытается использовать 'self.instance', будет восстановлен старый' connection_url'. Я не вижу никакой точки исправления в 'setUp'. С кодом, который мы показали, это потребует либо другого подхода, либо реструктуризации класса. – wim