Python模拟全局变量

标签 python unit-testing mocking

我正在使用 sys.modules['cv2'] = Mock() 来模拟 OpenCV 模块,但在使用 assertEqual 时遇到问题测试变量是否已使用全局变量正确设置。我稍微简化了代码。 我不确定我的 mock 是否正确。

这是我的单元测试文件:

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

最佳答案

也许做你想做的事情的最好方法是修补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 函数测试。

关于Python模拟全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26668515/

相关文章:

android - 如何在android单元测试中模拟Resources类以获得scaledDensity?

php - 在 PHP 单元中创建模拟对象

python - 很长的I/O进程能否由线程处理

python - BeautifulSoup - 从表格中抓取文本不起作用

python - 如何在另一个目录中运行python脚本,而不将脚本写入磁盘?

c# - 在 .NET MVC 中使用 HttpClient 进行单元测试 Controller

java - 与Web交互的应用程序的集成测试

python - 匹配两个 Python 列表的长度

unit-testing - Karma Jasmine 测试注入(inject)不起作用

Python AWS SQS 与 MOTO 模拟