1 votes

Impossible de simuler le nom du système d'exploitation avec Python sous Windows

J'ai la méthode suivante :

class Controls:

    def check_os(self) -> None:

        if os.name != "posix":
            raise OSError

J'essaie de le tester comme ceci :

import pytest

@pytest.fixture
def name_mock(mocker):
    return mocker.patch("path_to_module.controls.os.name", return_value="posix")

def test_check_os_fail(name_mock):
    controls = Controls()
    controls.check_os()

Mais alors l'erreur suivante est soulevée :

platform win32 -- Python 3.9.0, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
plugins: cov-2.11.1, mock-3.5.1  
collected 57 items / 56 deselected / 1 selected

tests\test_controls.py 
INTERNALERROR> Traceback (most recent call last):
...
NotImplementedError: cannot instantiate 'PosixPath' on your system

Que se passe-t-il exactement ?

1voto

MrBean Bremen Points 7850

Ce qui se passe ici, c'est que pytest utilise en interne un pathlib.Path qui, lors de l'initialisation, demande os.name pour définir les Path à utiliser. Il existe deux implémentations internes pour Path , PosixPath y WindowsPath qui ne sont disponibles que sous les systèmes respectifs. Comme vous simulez un système Posix par Parcheando os.name il essaie d'instancier un PosixPath qui n'est pas défini sous Windows.

Ce que vous pouvez faire dans ce cas est d'envelopper os.name dans votre propre fonction, par exemple quelque chose comme :

import os

def os_name():
    return os.name

class Controls:
    def check_os(self) -> None:
        if os_name != "posix":
            raise OSError

et corrigez cette fonction dans votre test :

@pytest.fixture
def name_mock(mocker):
    return mocker.patch("path_to_module.controls.os_name", return_value="posix")

De cette façon, vous ne corrigez que l'appel que vous êtes censé corriger, sans affecter les autres codes qui utilisent également la fonction os.name .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X