New submission from Evan Fagerberg <adioe...@gmail.com>:
Hello, I really like that this library allows for really strict mocking however one thing I have noticed is that it seems like using spec on a mock does not properly read the class body for attributes like some of the documentation claims. For example this is a snippet of the Logger class in python 3.6's `logging` module ```python class Logger(Filterer): name: str level: int parent: Union[Logger, PlaceHolder] propagate: bool handlers: List[Handler] disabled: int ``` Now I want to mock that class ensuring that propagate gets set to False for example ```python from unittest import mock from logging import Logger logger = mock.Mock(spec_set=Logger) logger.propagate = False assert logger.propagate is False *** AttributeError: Mock object has no attribute 'propagate' ``` I have noticed this does work when the value is initialized in the class body so for example ```python class Logger(Filterer): name: str level: int parent: Union[Logger, PlaceHolder] propagate: bool = False handlers: List[Handler] disabled: int ``` This would not fail with the test in question. Wondering if this is intended behavior or not or if I am misunderstanding something. I have tested this with Python 3.6.10, 3.8.2, all with the same result. ---------- components: Tests messages: 370712 nosy: efagerberg priority: normal severity: normal status: open title: spec_set/autospec/spec seems to not be reading attributes defined in class body type: behavior versions: Python 3.6, Python 3.8, Python 3.9 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue40864> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com