python - 模拟 Python 对象实例化

标签 python python-3.x namespaces mocking python-unittest

我想模拟一个对象的实例化,以便返回的对象是一个 MagicMock 对象。我的文件结构如下:

home_folder
|
|-namespace
|  |-Class1.py
|  |-Class2.py
|
|-tests
   |-unit_tests
      |-test_Class2.py

Class1.py 的内容为:
class Class1:
    ... class members ...

Class2.py 的内容为:
from Class1 import Class1

class Class2(Class1):

    classMethod(self):
        objInst = Class1()

        ... some logic ...

        return objInst

test_class2.py 的内容是:
from unittest import TestCase
from Class1 import Class1
from Class2 import Class2
from unittest.mock import patch, MagicMock

class TestClass2(TestCase):

    @patch("namespace.Class2.Class1")
    def test_classMethod(self, mock_class1):
        cl2Obj = Class2()

        cl1Obj = MagicMock(Class1())

        mock_class1.return_value = cl1Obj

        r = cl2Obj.classMethod()

        self.assertEqual(cl1Obj, r)

运行这个测试给了我:
<Class1.Class1 object at 0xnum> != <MagicMock name='Class1()' spec='Class1' id=num>

我尝试使用
@patch("namespace.Class1.Class1")

但这没有帮助。试
mock_class1.__init__.return_value = cl1Obj

抛出一个错误说
Attribute Error: 'method' object has no attribute 'return_value'

我如何模拟 objInst = Class1() 以便 objInst 最终持有一个 MagicMock 对象?

最佳答案

你让这比它需要的更复杂。 mock_class1已经是一个可调用的对象,并将返回另一个模拟 - 无论在何处调用它都是相同的。所以这很好用:

class TestClass2(TestCase):

    @patch("namespace.Class2.Class1")
    def test_classMethod(self, mock_class1):
        cl2Obj = Class2()
        cl1Obj = mock_class1()
        r = cl2Obj.classMethod()
        self.assertEqual(cl1Obj, r)

关于python - 模拟 Python 对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52995696/

相关文章:

python - numba 的 Scipy 特殊函数

python - Celery 不使用 Redis 在 Kubernetes 中处理任务

c++ - 使用 isalpha 函数时不需要 std 命名空间

python - 如何在抓取网站时绕过免责声明

python - 当用户输入字符串而不是整数时如何保护我的 python 代码?

asp.net-mvc - 如何在 MVC3 的自定义路由处理程序中指定命名空间?

import - typescript 中的 `from foo import *`

python - 使用 message.content 发送消息

Python:计算列表的笛卡尔幂的最短方法

python - 如何根据字典属性唯一合并字典列表