在类中使用的Python mock os.environ

时间:2017-02-22 04:53:20

标签: python unit-testing mocking python-unittest

我正在尝试在课堂内模仿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,尝试了一些解决方案,但无法做到正确。

提前致谢!

1 个答案:

答案 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