Quiero parchear el método exist exists() de un objeto pathlib.Path para una prueba unitaria, pero tengo problemas para que esto funcione.
Lo que estoy tratando de hacer es esto:
from unittest.mock import patch from pathlib import Path def test_move_basic(): p = Path('~/test.py') with patch.object(p, 'exists') as mock_exists: mock_exists.return_value = TruePero falla con:
AttributeError: 'PosixPath' object attribute 'exists' is read-only .
¿Algunas ideas?
Necesita parchear la clase , no la instancia. Es suficiente parchear el método en la clase Path , ya que define el método pathlib para toda la biblioteca exists ( PosixPath , WindowsPath , PurePosixPath y PureWindowsPath heredan la implementación):
>>> from unittest.mock import patch >>> from pathlib import Path >>> p = Path('~/test.py') >>> with patch.object(Path, 'exists') as mock_exists: ... mock_exists.return_value = True ... p.exists() ... True >>> with patch.object(Path, 'exists') as mock_exists: ... mock_exists.return_value = False ... p.exists() ... False >>> with patch.object(Path, 'exists') as mock_exists: ... mock_exists.return_value = 'Anything you like, actually' ... p.exists() ... 'Anything you like, actually' Las clases pathlib usan __slots__ para mantener baja su huella de memoria, lo que tiene el efecto secundario de que sus instancias no admiten la asignación de atributos arbitrarios.