2016-12-19 4 views
5

У меня есть приложение, которое импортирует модуль из PyPI. Я хочу писать unittests для исходного кода этого приложения, но я не хочу использовать модуль из PyPI в этих тестах.
Я хочу полностью издеваться над ним (тестовая машина не будет содержать этот модуль PyPI, поэтому любой импорт не будет работать).Мощный полный модуль в python

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

try: 
    except ImportError: 

и поймать эту ошибку импорта, а затем использовать команду command_module.run(). Это кажется довольно рискованным/уродливым, и мне было интересно, есть ли другой способ.

Другая идея заключалась в написании адаптера для обертывания этого модуля PyPI, но я все еще работаю над этим.

Если вы знаете какой-либо способ, я могу высмеять весь пакет python, я был бы очень признателен. Спасибо.

ответ

2

Если вы хотите копаться в системе импорта Python, я настоятельно рекомендую David Beazley's talk.

Что касается вашего конкретного вопроса, вот пример, который проверяет модуль, когда его зависимость отсутствует.

bar.py - модуль, который вы хотите проверить, когда my_bogus_module отсутствует

from my_bogus_module import foo 

def bar(x): 
    return foo(x) + 1 

mock_bogus.py - файл в с тестами, которые будут загружать макет модуля

from mock import Mock 
import sys 
import types 

module_name = 'my_bogus_module' 
bogus_module = types.ModuleType(module_name) 
sys.modules[module_name] = bogus_module 
bogus_module.foo = Mock(name=module_name+'.foo') 

test_bar.py - тесты bar.py когда my_bogus_module не имеется

import unittest 

from mock_bogus import bogus_module # must import before bar module 
from bar import bar 

class TestBar(unittest.TestCase): 
    def test_bar(self): 
     bogus_module.foo.return_value = 99 
     x = bar(42) 

     self.assertEqual(100, x) 

Возможно, вы должны сделать это немного безопаснее, установив, что my_bogus_module на самом деле не доступен, когда вы запускаете свой тест. Вы также можете посмотреть на метод pydoc.locate(), который попытается что-то импортировать, и верните None, если он не сработает. По-видимому, это общедоступный метод, но он не документирован.

+0

Это именно то, что я искал. Спасибо! – TzurEl