Атрибут фиктивного класса с декоратором @patch - PullRequest
0 голосов
/ 26 июня 2018

Как можно смоделировать свойство объекта тестируемого класса с помощью декоратора @patch?

Учитывая следующий тест:

def test_hangup(self):
    stub_call = Mock()

    cut = TelefonyInterface()
    cut.call = stub_call
    cut.hangup()

    self.assertEqual(1, stub_call.hangup.call_count)
    self.assertEqual(None, cut.call)

Я хотел бы использовать mock.patch Декоратор здесь, чтобы его было легче читать.Примерно так:

@patch.object(TelefonyInterface, 'call')
def test_hangup(self, call):
    cut = TelefonyInterface()
    cut.hangup()

    self.assertEqual(1, call.hangup.call_count)
    self.assertEqual(None, cut.call)

Но я получаю следующее AttributeError:

AttributeError: <class '(...).TelefonyInterface'> does not have the attribute 'call'

Мой TelefonyInterface выглядит примерно так:

class TelefonyInterface:
    def __init__(self):
        self.call = None

    def dial(self, number):
        self.call = ...

    def hangup(self):
        if self.call:
            self.call.hangup()

    ...

Как правильносделать это?

1 Ответ

0 голосов
/ 26 июня 2018

Проблема в том, что вы исправляете класс TelefonyInterface, который не имеет атрибута call.Этот атрибут определяется в экземпляре во время инициализации.Чтобы выполнить то, что вы хотите, исправьте экземпляр вместо класса:

def test_hangup(self):
    cut = TelefonyInterface()
    with patch.object(cut, 'call') as call:
        cut.hangup()

        self.assertEqual(1, call.hangup.call_count)
        self.assertEqual(None, cut.call)
...