Mock
и create_autospec
принимают spec_set
, который устанавливает результирующий фиктивный экземпляр для отклонения установки атрибута, которого еще нет в объекте spec
.Однако создание фиктивного экземпляра с Mock(spec_set=True)
не позволяет установить атрибут ghost, а create_autospec(.., spec_set=True)
- нет.
Я написал некоторый код для проверки этой проблемы.
from unittest.mock import Mock, create_autospec
def foo(a, b, c):
pass
m = Mock(spec_set=foo)
try:
m.bar = 'value'
except AttributeError:
print("m has no attribute 'bar'")
else:
assert False
m2 = create_autospec(spec=foo, spec_set=True)
try:
m2.bar = 'value'
except AttributeError:
print("m2 has no attribute 'bar'")
else:
assert False
m2.bar
пропускает spec_set=True
, что приводит к assert False
в последней строке.Я думаю, что m2.bar = ...
должен был потерпеть неудачу из-за того, что spec_set
был True
.Я неправильно прочитал документацию?Я взял соответствующую часть из документации:
spec_set: более строгий вариант спецификации.Если используется, попытка установить или получить атрибут на макете, который не находится на объекте, переданном как spec_set, вызовет AttributeError.
Я использовал python 3.7.Заранее спасибо.