Estoy preguntando cómo simular una propiedad de clase en una prueba de unidad usando Python 3. Intenté lo siguiente, lo cual tiene sentido para mí siguiendo los documentos, pero no funciona:
foo.py:
class Foo(): @property def bar(self): return 'foobar' def test_foo_bar(mocker): foo = Foo() mocker.patch.object(foo, 'bar', new_callable=mocker.PropertyMock) print(foo.bar) Instalé pytest y pytest_mock y ejecuté la prueba de esta manera:
pytest foo.pyTuve el siguiente error:
> setattr(self.target, self.attribute, new_attr) E AttributeError: can't set attribute /usr/lib/python3.5/unittest/mock.py:1312: AttributeErrorMi expectativa sería que la prueba se ejecute sin errores.
El mecanismo de propiedad se basa en que el atributo de propiedad se defina en la clase del objeto. No puede crear un método o atributo de "propiedad similar" en una sola instancia de una clase (para una mejor comprensión, lea sobre el protocolo descriptor de Python)
Por lo tanto, debe aplicar el parche a su clase; puede usar la declaración with para que la clase se restaure correctamente después de su prueba:
def test_foo_bar(mock): foo = Foo() with mock.patch(__name__ + "Foo.bar", new=mocker.PropertyMock) print(foo.bar)