[New-bugs-announce] [issue40864] spec_set/autospec/spec seems to not be reading attributes defined in class body

Evan Fagerberg report at bugs.python.org
Thu Jun 4 10:28:47 EDT 2020


New submission from Evan Fagerberg <adioevan at 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 <report at bugs.python.org>
<https://bugs.python.org/issue40864>
_______________________________________


More information about the New-bugs-announce mailing list