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