Модульное тестирование 'pathlib.Path.is_file' в Python 3.x - PullRequest
1 голос
/ 07 мая 2019

Я новичок в модульном тестировании на Python и у меня проблемы с запуском моих тестов.Я хочу реализовать следующий тестовый класс, как показано здесь: https://www.toptal.com/python/an-introduction-to-mocking-in-python,, но слегка измененный.Вместо использования os.path.isfile я хочу использовать pathlib.Path.is_file.

Это фактический класс для тестирования:

import os

from pathlib import Path

class FileUtils:

    @staticmethod
    def isFile(file):
        return Path(file).is_file()

    @staticmethod
    def deleteFile(file):
        if FileUtils.isFile(file):
            os.remove(file)

И это класс тестирования:

import mock, unittest

class FileUtilsTest(unittest.TestCase):

    testFilename = "filename"

    @mock.patch('FileUtils.Path')
    @mock.patch('FileUtils.os')
    def testDeleteFiles(self, osMock, pathMock):

        pathMock.is_file.return_value = False
        FileUtils.deleteFile(self.testFilename)
        self.assertFalse(osMock.remove.called, 'Failed to not remove the file if not present.')

        pathMock.is_file.return_value = True
        FileUtils.deleteFile(self.testFilename)
        osMock.remove.assert_called_with(self.testFilename)

Это приведет к следующему сообщению об ошибке:

Finding files... done.
Importing test modules ... done.

======================================================================
FAIL: testDeleteFile (FileUtilsTest.FileUtilsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\AppData\Local\Continuum\anaconda3\lib\site-packages\mock\mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "...\FileUtilsTest.py", line 13, in testDeleteFile
    self.assertFalse(osMock.remove.called, 'Failed to not remove the file if not present.')
AssertionError: True is not false : Failed to not remove the file if not present.

----------------------------------------------------------------------
Ran 1 test in 0.003s

FAILED (failures=1)

Как проверить метод FileUtils.deleteFile с помощью @mock.patch декораторов?

1 Ответ

1 голос
/ 07 мая 2019

Проблема здесь в том, что когда вы исправляете символ Path в модуле, вы заменяете символ для конструктора Path.Но is_file не является атрибутом конструктора - это атрибут объекта, возвращаемого конструктором.Вызывается конструктор, и вы вызываете is_file для возвращаемого значения.Так что вам нужно издеваться и над этой частью.Для этого установите возвращаемый макет, когда вызывается символ Path.

import mock, unittest

class FileUtilsTest(unittest.TestCase):

    testFilename = "filename"

    @mock.patch('FileUtils.Path')
    @mock.patch('FileUtils.os')
    def testDeleteFiles(self, osMock, pathMock):
        mock_path = MagicMock()
        pathMock.return_value = mock_path

        mock_path.is_file.return_value = False
        FileUtils.deleteFile(self.testFilename)
        self.assertFalse(osMock.remove.called, 'Failed to not remove the file if not present.')

        mock_path.is_file.return_value = True
        FileUtils.deleteFile(self.testFilename)
        osMock.remove.assert_called_with(self.testFilename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...