Как смоделировать в python unittest библиотеку, не установленную локально? - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь протестировать, используя unittest a python 3.6 скрипт, который начинается с (my_app.py):

import sys
from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ['opt1', 'opt2', 'opt3'])
opt1 = args['opt1']
opt2 = args['opt2']
opt3 = args['opt3']
....

, поэтому в своем тесте я сделал что-то вроде:

import unittest
import datetime
from mock import patch
import my_app

class TestMyApp(unittest.TestCase):

    @patch('awsglue.utils.getResolvedOptions')
    def test_mock_stubs(self, patch_opts):
        patch_opts.return_value = {}
        ....

, но вскоре тест завершается неудачно на import my_app с:

ModuleNotFoundError: No module named 'awsglue'

, поскольку awsglue не установлен локально. Как я могу протестировать модуль, который импортирует не локально установленную библиотеку, а также макетирует ее в моем тесте?

1 Ответ

1 голос
/ 29 марта 2020

Вам нужно будет смоделировать импортированный модуль, прежде чем произойдет импорт для my_app. patch здесь не будет работать, потому что patch импортирует модуль для его исправления. И в этом случае сам этот импорт вызовет ошибку.

Для этого проще всего обмануть python, думая, что awsglue уже импортировано. Вы можете сделать это, поместив свой макет прямо в словарь sys.modules. После этого вы можете выполнить импорт my_app.

import unittest
import sys
from unittest import mock


class TestMyApp(unittest.TestCase):

    def test_mock_stubs(self):
        # mock the module
        mocked_awsglue = mock.MagicMock()
        # mock the import by hacking sys.modules
        sys.modules['awsglue.utils'] = mocked_awsglue
        mocked_awsglue.getResolvedOptions.return_value = {}

        # move the import here to make sure that the mocks are setup before it's imported
        import my_app

. Вы можете переместить импортируемую часть хака в метод фиксации setup.

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

...