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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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é :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?