Python 模拟全局变量
我正在使用 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
函数。