насмешка / исправление значения вычисляемого атрибута из метода класса - PullRequest
3 голосов
/ 06 августа 2020

Я пытаюсь написать тест для функции, которая вызывает метод класса объекта - этот метод класса возвращает новый экземпляр этого класса.

Здесь есть множество примеров исправления атрибутов класса в stackoverflow и в других местах, но мне трудно понять, как исправить атрибут / значение, чтобы я мог проверить свою функцию. Я сослался на этот ответ.

По сути, я пытаюсь исправить атрибут xxxx экземпляра Foo (внутри myFn), чтобы я мог проверить / подтвердить последующее значение от его вызова до some_other_function()

. Приведенный ниже код является автономным и запускаемым для проблемы: я получаю AttributeError: Foo не имеет атрибута 'xxxx'

import time
import unittest
from unittest.mock import patch, PropertyMock

class Foo(object):
    def __init__(self, xxxx):
        """long running task"""
        time.sleep(5)
        self.xxxx = xxxx

    @classmethod
    def get(cls):
        """also a long running task"""
        time.sleep(5)
        xxxx = 555
        return cls(xxxx)

def myFn():
    v = Foo.get().xxxx
    # the patched `xxxx` should be 666 at this point
    return some_other_function(v)

class Test(unittest.TestCase):

    @patch('__main__.Foo', autospec=True)
    def test_myFn(self, mock_Foo):
        with patch('__main__.Foo.xxxx', new_callable=PropertyMock, return_value=666):
            x = myFn()
            self.assertEqual(x, 666)

if __name__ == '__main__':
    unittest.main()

Очень благодарен за помощь!

1 Ответ

3 голосов
/ 10 августа 2020

Вы должны использовать параметр create, который заставит создать атрибут, если он не существует:

def test_myFn(self):
    with patch('__main__.xxxx', new_callable=PropertyMock, create=True, return_value=666):
        x = myFn()
        self.assertEqual(666,x)
...