Bonjour,
dans le cadre d'un projet professionnel, je dois ici d�placer un fichier d'un endroit vers un autre.
J'utilise pytest pour les assert et pytest-mock si besoin dans mes tests.
Voici le code de la m�thode de la classe traitant de ce d�placement de fichier :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from pathlib import Path
from shutil import move
class FileManagerError(Exception):
"""File error class."""
class FileManager:
def rename_PDF_file(self, sourcefile: Path, destfile: Path) -> None:
try:
move(sourcefile, destfile)
except (FileNotFoundError, PermissionError) as err:
raise FileManagerError(
f"ERREUR de renommage du fichier {sourcefile.name} "
+ f"en {destfile.name} : {err}"
) from err |
Le test s'assurant que le d�placement du fichier est ok fonctionne et passe au vert dans Pytest.
En revanche, celui levant l'exception FileManagerError ne fonctionne pas et ne l�ve pas l'exception.
Voici le code du test concern� :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from pathlib import Path
import pytest
from pytest_mock import MockerFixture
import shutil
from file_manager import FileManager, FileManagerError
def test_rename_PDF_file_is_not_ok(
self, tmp_path: Path, mocker: MockerFixture
) -> None:
sourcefile: Path = tmp_path / "in.pdf"
sourcefile.write_bytes(b"foo bar")
destfile: Path = tmp_path / "out.pdf"
mocker.patch.object(shutil, "move", side_effect=PermissionError)
manager: FileManager = FileManager(tmp_path, tmp_path)
with pytest.raises(FileManagerError):
manager.rename_PDF_file(sourcefile=sourcefile, destfile=destfile) |
L'erreur est :
Failed: DID NOT RAISE <class 'file_manager.FileManagerError'>
J'ai patch� shutil.move avec diff�rents effets de bord, comme IOError, FileNotFoundError et ici PermissionError, m�me constat.
J'ai essay� mocker.patch('shutil.move', ...) � la place de mocker.patch.object(shutil, 'move', ...), m�me r�sultat.
J'ai aussi essay� ceci :
1 2 3 4 5 6 7 8 9 10 11 12
| def test_rename_PDF_file_is_not_ok(
self, tmp_path: Path, mocker: MockerFixture
) -> None:
def shutil_patch(*args: Any, **kwargs: Any) -> None:
raise PermissionError
sourcefile: Path = tmp_path / "in.pdf"
sourcefile.write_bytes(b"foo bar")
destfile: Path = tmp_path / "out.pdf"
mocker.patch.object(shutil, "move", shutil_patch)
manager: FileManager = FileManager(tmp_path, tmp_path)
with pytest.raises(FileManagerError):
manager.rename_PDF_file(sourcefile=sourcefile, destfile=destfile) |
Et pareil.
Je sais que je peux inventer un r�pertoire bidon pour la destination du fichier afin que l'exception FileNotFoundError soit lev�e et que mon test passe au vert.
Mais bof quoi. Je pr�f�re mocker shutil.move.
Auriez-vous une id�e ?
Partager