我正在尝试在课堂内模仿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,尝试了一些解决方案,但无法做到正确。
提前致谢!
答案 0 :(得分:1)
这里的问题是在创建类时(导入时)设置connection_url
。如果你想模仿它,你可以在使用该属性之前修补类本身的属性:
class TestMyClass(TestCase):
@patch.object(file.MyClass, 'connection_url', 'Dummy')
def setUp(self):
self.instance = MyClass()
您仍需要在导入时处理潜在的KeyError
- 也就是说,在导入文件之前,您需要确保测试运行器在环境中具有虚拟值< / em>或者您必须修改file.py
中的代码,以确保它不会引发KeyError
。这里有一些策略。如果未在环境中设置KeyError
,则可以取消connection_url = default_value
class MyClass():
connection_url = os.environ.get('DB', default_value)
:
__init__
或者您可以将connection_url提取到class MyClass():
def __init__(self):
connection_url = os.environ['DB']
:
patch.dict
后一个代码还有一个额外的好处,即connection_url
应该开始工作。
请注意,如果您选择前两种方法中的任何一种,则实例在setUp
方法期间只会打包class TestMyClass(TestCase):
@patch.object(file.MyClass, 'connection_url', 'Dummy')
def test_first_thing(self):
self.instance = MyClass()
...
@patch.object(file.MyClass, 'connection_url', 'Dummy')
def test_second_thing(self):
self.instance = MyClass()
...
- 后续测试将不会进行修补。这很可能会成为一个显示器,你需要在每个测试中创建一个新实例:
enter code here