У меня есть модуль с функцией (назовите ее a()
), которая вызывает другую функцию, определенную в том же модуле (назовите ее __b()
). __b()
- это функция, которая обращается к веб-сайту через urllib2
и возвращает некоторые данные. Сейчас я пытаюсь протестировать a()
, но, конечно, не хочу, чтобы мои модульные тесты общались в Интернете. Таким образом, я думаю, что если я смогу обезьяно запатчить __b()
с помощью функции, которая возвращает стандартные данные, тогда я смогу написать тесты для a()
.
Если быть более конкретным, мой модуль выглядит примерно так:
def a():
return __b("someval")
def __b(args):
return something_complex_with_args
Итак, теперь я хочу протестировать a()
, но мне нужно исправить __b
. Проблема в том, что A) подавляющее большинство информации об исправлении monkey применяется к методам класса, а не к функциям в модуле, и B) функция, которую я хочу исправить, является частной. Я готов изменить __b
на не конфиденциальный, если это сделает процесс более осуществимым, но не хочу.
Предложения?
Изменить: в нынешнем виде тестовый класс выглядит так:
from unittest import TestCase
import mymodule
def newfn(args):
return {"a" : "b"}
mymodule._b = newfn
class TestMyModule(TestCase):
def test_basic(self):
print(mymodule.a('somearg'))
И когда я запускаю это, я вижу результат, если исправление обезьяны не было выполнено вообще, вместо того, чтобы видеть, как {'a': 'b'}
распечатывается.
__name
. Вместо этого используйте формат_name
, чтобы обозначить, что это внутренняя функция, при этом позволяя тем вещам, которые действительно нуждаются в доступе, получить к ней доступ. - person Amber   schedule 27.12.2012__x
) - это не то же самое, что private, и если вы точно не знаете, что это такое, вам, вероятно, не следует его использовать. В Python нет сокрытия данных. - person Gareth Latty   schedule 27.12.2012