如何模拟类而不是对象?

时间:2019-03-19 15:43:45

标签: python unit-testing mocking

我该如何嘲笑以下内容?

import os
from unittest import TestCase
from unittest.mock import patch

class A:
    VAR_A = os.environ.get("ABC")

    @classmethod
    def foo(cls):
       return cls.VAR_A

@patch.dict(os.environ, {'ABC': 'abc'})
class Test_A(TestCase):
    def test_foo(self):
        self.assertEqual(A.foo(), 'abc')

这个VAR_A并没有被嘲笑。 AssertionError: None != 'abc'

1 个答案:

答案 0 :(得分:1)

因此,您想测试foo()函数。与其尝试在class对象定义之前更改环境变量,不如尝试模拟已经存在的class的属性。在运行测试之前创建了类对象,并且VAR_A属性已经初始化。

import os
from unittest import TestCase
from unittest.mock import patch

class A:
    VAR_A = os.environ.get("ABC")

    @classmethod
    def foo(cls):
       return cls.VAR_A

@patch.object(A, 'VAR_A', 'abc')
class Test_A(TestCase):
    def test_foo(self):
        self.assertEqual(A.foo(), 'abc')