Создание экземпляров Mocking объекта Python - PullRequest
0 голосов
/ 25 октября 2018

Я хочу смоделировать создание объекта, чтобы возвращаемый объект был объектом 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?

1 Ответ

0 голосов
/ 25 октября 2018

Вы делаете это более сложным, чем нужно.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)
...