Макет Y (из X import Y) в doctest (python) - PullRequest
3 голосов
/ 07 февраля 2010

Я пытаюсь создать doctest с макетом функции, который находится в отдельном модуле. и это импортируется как ниже

from foomodule import foo

def bar():
    """
    >>> from minimock import mock
    >>> mock('foo', nsdicts=(bar.func_globals,), returns=5)
    >>> bar()
    Called foo()
    10
    """
    return foo() * 2


import doctest
doctest.testmod()

foomodule.py:

def foo():
    raise ValueError, "Don't call me during testing!"

Это не удалось.

Если я изменю импорт на импорт foomodule и везде используйте foomodule.foo Тогда это работает.

Но есть ли какое-нибудь решение для функции пересмешивания, импортированной способом выше?

Ответы [ 2 ]

4 голосов
/ 07 февраля 2010

Вы только что встретили одну из многих причин, по которым лучше никогда не импортировать объекты из «внутри» модулей - только из самих модулей (возможно, из пакетов). Мы сделали это правило частью нашего руководства по стилю в Google (опубликовано здесь ), и я от всей души рекомендую его каждому программисту Python.

Как говорится, вам нужно взять foomodule.foo, который вы только что заменили на макет, и вставить его в текущий модуль. Я не помню достаточно внутренней документации doctest, чтобы подтвердить,

   >>> import foomodule
   >>> foo = foomodule.foo

будет достаточно для этого - попробуйте, и если это не сработает, вместо этого сделайте

   >>> import foomodule
   >>> import sys
   >>> sys.modules[__name__].foo = foomodule.foo

Да, это беспорядок, но причина этого беспорядка в том, что выглядит невинно from foomodule import foo - избегайте этого, и ваша жизнь станет проще и продуктивнее; -).

2 голосов
/ 07 февраля 2010

Наконец-то выяснилось, что это скорее проблема магистральной версии MiniMock. Старый стабильный работает как положено.

...