Атрибуты насмешливого экземпляра - PullRequest
1 голос
/ 04 марта 2020

Пожалуйста, помогите мне понять, почему следующее не работает. В частности - атрибуты экземпляра тестируемого класса не видны для Python unittest.Mock.

В приведенном ниже примере bar атрибут экземпляра недоступен. Возвращенная ошибка:

AttributeError: <class 'temp.Foo'> does not have the attribute 'bar'
import unittest
from unittest.mock import patch

class Foo:
    def __init__(self):
        super().__init__(self)
        self.bar = some_external_function_returning_list()

    def do_someting(self):
        calculate(self.bar)

class TestFoo(unittest.TestCase):

    @patch('temp.Foo.bar')
    def test_do_something(self, patched_bar):
        patched_bar.return_value = ['list_elem1', 'list_elem2']

1 Ответ

1 голос
/ 04 марта 2020

Исправление используется для изменения имени или поиска атрибутов. В этом случае есть нет bar атрибута класса temp.Foo.

Если вы хотите исправить переменную instance , вам нужно либо существующий экземпляр для изменения

def test(self):
    f = Foo()
    with patch.object(f, 'bar', 3):
        self.assertEqual(f.bar, 3)

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

def test(self):
    with patch('some_external_function_returning_list', return_value=3):
        f = Foo()
    self.assertEqual(f.bar, 3)
...