Насмешка над вызовом функции экземпляра класса, который является членом другого экземпляра класса в Python - PullRequest
0 голосов
/ 25 февраля 2019

Я использую Python2.7 и модули unittest и mock для этой версии.У меня есть ситуация, когда я хотел бы смоделировать вызов функции экземпляра класса и его возвращаемое значение.Проблема в том, что этот экземпляр является членом экземпляра другого класса.Позвольте мне уточнить в коде.

Допустим, у меня есть класс Bin, определенный в my_package/bin.py:

class Bin():
    def __init__(self):
        # code to initialize other stuff
        self.rubbish = self.fill_with_rubbish()  # creates list of rubbish instances

    def inspect_rubbish(self):
        inspection_results = []
        for rubbish in self.rubbish:
            inspection_results.append(rubbish.inspect())

У меня также есть класс Rubbish, определенный в my_package/rubbish.py:

class Rubbish():
    def __init__(self):
        # initialization stuff

    def inspect(self):
        return 'Nice rubbish'   

Теперь в моей папке /tests есть тестовый файл test_bin.py, в котором я настраиваю среду и импортирую мусорное ведро и мусор следующим образом:

import my_package.bin as _bin
import my_package.rubbish as _rubbish

и япытаюсь проверить inspect_rubbish() класса Bin.Вышесказанное, безусловно, не мой рабочий код, но в моем исходном коде я хотел бы иметь возможность изменить значение повторной настройки inspect для Rubbish isntance и выполнять различные assert вызовы для проверкисколько раз он вызывался и т. д.

Я застрял на том, как на самом деле издеваться над методами экземпляров мусора экземпляра Bin.Я пытался решить проблему с некоторыми исправлениями, но безрезультатно.

def test_inspect_rubbish(self):
    with patch('my_package.bin.Bin', autospec=True) as mock_bin, \
        patch.object('my_package.rubbish.Rubbish.inspect') as mock_inspect:

        mock_inspect.return_value = 'Bad rubbish'

        bin = _bin.Bin()
        bin.rubbish = [MagicMock(), MagicMock()]
        result = bin.inspect_rubbish()

        mock_inspect.assert_called()

Но этот код не работает с AssertionError: Expected 'inspect' to have been called., поэтому я предполагаю, что он вообще не выполняет то, к чему я намереваюсь.Как бы я стал издеваться над этим поведением и впоследствии делать на нем утверждения?

1 Ответ

0 голосов
/ 25 февраля 2019
  1. Поскольку вы издевались Bin, bin.inspect_rubbish() - это ложный вызов, который ничего не делает.
  2. bin.rubbish = [MagicMock(), MagicMock()] означает, что смоделированный Rubbish.inspect никогда не вызывается, только MagicMock().inspect для каждого из этих издевательств.

Этот код работает:

def test_inspect_rubbish(self):
    with patch('my_package.rubbish.Rubbish.inspect') as mock_inspect:

        mock_inspect.return_value = 'Bad rubbish'

        bin = _bin.Bin()
        bin.rubbish = [_rubbish.Rubbish(), _rubbish.Rubbish()]
        result = bin.inspect_rubbish()

        mock_inspect.assert_called()

Демо: https://repl.it/repls/RundownTastyKernel

Я также изменил patch.object на patch потому что это дало ошибку.

...