Я хочу пропатчить функцию _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()
.