Python模拟全局变量

时间:2014-10-31 06:12:49

标签: python unit-testing mocking

我使用sys.modules['cv2'] = Mock()模拟OpenCV模块,但我无法使用assertEqual来测试变量是否已使用全局变量正确设置。我已经简化了一些代码。 我不确定我的嘲笑是否正确。

这是我的单元测试文件:

from mock import patch, Mock
sys.modules['cv2'] = Mock()
from MyClass import MyClass
del sys.modules['cv2']

....

def testFunction()
    myObject = MyClass()
    self.assertEqual(myObject.val, ?) # here i don't know how to test the equality

和文件MyClass.py

import module

val1 = cv2.function(1)
val2 = cv2.function(2)

class MyClass():
    def _init_(self)
        self.val = val1

2 个答案:

答案 0 :(得分:1)

也许做你想做的最好方法是补丁var1。无论如何,因为我不确定你想做什么我会向你提出一些解决方案:

from mock import patch

@patch("cv2.function")
def testfunction(mfun):
    mfun.return_value = 200
    import MyClass
    MyObject = MyClass.MyClass()
    assert MyObject.var == 200


import MyClass
print(MyClass.MyClass().var) #my cv2.function(1) stub return -1... but here you can see the real value

@patch("MyClass.var1")
def testfunction(mvar1):
    mvar1 = 300
    MyObject = MyClass.MyClass()
    assert MyObject.var == 300

请注意,在第一种情况下,您必须在patch上下文中导入MyClass。第二个示例只是模块上的变量将被修补。

如果您必须编写许多使用补丁的方法,例如第一个示例,您可以使用patch作为unittest类的类装饰器:您将在所有测试中修补cv2函数。

答案 1 :(得分:0)

class Chameleon(Mock):
    def __eq__(self, other):
        return True

另请查看MagicMock