Пит-макет из другого модуля - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь смоделировать класс, который создается в конструкторе класса, который я пытаюсь проверить. Если я определяю класс, который пытаюсь смоделировать в том же модуле, что и тот, который пытаюсь проверить, все работает нормально, но когда они находятся в отдельных модулях, я получаю ошибки.

Вот мой пример, взятый из здесь (Обратите внимание, что в моем реальном примере тестовый класс находится в подмодуле «tests», а два других файла находятся в модуле «app.sr c .code ...».

Что мне не хватает?

helper.py:

import os

class Helper:
    def __init__(self, path):
        self.path = path

    def get_path(self):
        base_path = os.getcwd()
        return os.path.join(base_path, self.path)

worker.py:

from helper import Helper

class Worker:    
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print(f'Working on {path}')
        return path

test_worker.py:

import unittest
from unittest.mock import patch
from worker import Worker


class WorkerTest(unittest.TestCase):
    def test_patching_class(self):
        with patch('helper.Helper') as MockHelper:
            MockHelper.return_value.get_path.return_value = 'testing'
            worker = Worker()
            MockHelper.assert_called_once_with('db')
            self.assertEqual(worker.work(), 'testing')

1 Ответ

0 голосов
/ 27 апреля 2020

Вам нужно использовать декораторы patch , чтобы создать макет для класса Helper модуля helper.py.

Например,

helper.py:

import os


class Helper:
    def __init__(self, path):
        self.path = path

    def get_path(self):
        base_path = os.getcwd()
        return os.path.join(base_path, self.path)

worker.py:

from helper import Helper


class Worker:
    def __init__(self):
        self.helper = Helper('db')

    def work(self):
        path = self.helper.get_path()
        print(f'Working on {path}')
        return path

test_worker.py:

import unittest
from unittest.mock import patch
from worker import Worker


class TestWorker(unittest.TestCase):
    def test_work(self):
        with patch('worker.Helper') as mock_Helper:
            mock_helper_instance = mock_Helper.return_value
            mock_helper_instance.get_path.return_value = 'testing'
            worker = Worker()
            mock_Helper.assert_called_once_with('db')
            self.assertEqual(worker.work(), 'testing')


if __name__ == '__main__':
    unittest.main()

Результаты модульных испытаний с отчетом о покрытии:

Working on testing
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Name                                        Stmts   Miss  Cover   Missing
-------------------------------------------------------------------------
src/stackoverflow/61008064/helper.py            7      3    57%   6, 9-10
src/stackoverflow/61008064/test_worker.py      13      0   100%
src/stackoverflow/61008064/worker.py            8      0   100%
-------------------------------------------------------------------------
TOTAL                                          28      3    89%
...