Python 模拟全局变量

1 投票
2 回答
8082 浏览
提问于 2025-04-30 19:44

我正在使用 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
class Chameleon(Mock):
    def __eq__(self, other):
        return True

另外,看看 MagicMock 这个东西。

2

也许你想做的事情最好的办法是对 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 函数。

撰写回答