Python фиктивная итераторная функция внутри класса - PullRequest
1 голос
/ 31 марта 2020

Я хочу пропатчить функцию _iter_num() внутри моего класса Num, чтобы он мог выдавать ошибку при вызове. Однако следующий патч не работает.

# this_file.py
from unittest.mock import patch, MagicMock
import pytest

class Num:
    def __init__(self):
        self.iter = self._iter_num()

    def _iter_num(self):
        yield 1

    def get_next(self):
        return next(self.iter)

@patch("this_file.Num._iter_num") # this_file is the filename.
def test_mock(mock_iterator):
    mock_iterator.__next__.side_effect = ValueError
    it = Num()
    # it.iter = MagicMock()
    # it.iter.__next__.side_effect = ValueError

    with pytest.raises(ValueError):
        it.get_next()
# Failed: DID NOT RAISE <class 'ValueError'>

Когда я непосредственно устанавливаю self.iter на MagicMock, он работает

# it.iter = MagicMock()
# it.iter.__next__.side_effect = ValueError

Однако, поскольку другие функции в моем коде, которые сбрасывают self.iter = self.iter_num(), кроме __init__, я не могу просто установить атрибут без исправления функции iter_num().

1 Ответ

2 голосов
/ 31 марта 2020

В init self._iter_num() - это , называемое , и возвращаемое значение присваивается.

Вы делаете это:

mock_iterator.__next__.side_effect = ValueError

Но вы должны сделать это:

mock_iterator.return_value.__next__.side_effect = ValueError
...