Пересмешивать импортированные модули в Python - PullRequest
4 голосов
/ 27 февраля 2010

Я пытаюсь реализовать модульные тесты для функции, которая использует импортированные внешние объекты.

Например, helpers.py :

import os
import pylons

def some_func(arg):
   ...
   var1 = os.path.exist(...)
   var2 = os.path.getmtime(...)
   var3 = pylons.request.environ['HTTP_HOST']
   ...

Так что, когда я создаю для него модульный тест, я делаю насмешку (в моем случае - minimock) и заменяя ссылки на pylons.request и os.path:

import helpers
def test_some_func():
    helpers.pylons.request = minimock.Mock("pylons.request")
    helpers.pylons.request.environ = { 'HTTP_HOST': "localhost" }
    helpers.os.path = minimock.Mock(....)
    ...
    some_func(...)
    # assert
    ...

Это не выглядит хорошо для меня.

Есть ли другой лучший способ или стратегия для замены импортированных функций / объектов в Python?

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

Использовать библиотеку насмешек в voidspace и возможность ее исправления / обертывания.

http://www.voidspace.org.uk/python/mock/patch.html

1 голос
/ 12 марта 2010

Что ж, в minimock есть более простая парадигма для этого, чем та, которую вы используете выше:

>>> from minimock import mock
>>> import os.path
>>> mock('os.path.isfile', returns=True)

См. http://pypi.python.org/pypi/MiniMock#creating-mocks

Как только вы это сделаете, любой модуль, который делает os.path.isfile("blah"), получит обратно True. Вам не нужно идти и явно переназначать пространство имен тестируемого модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...