2015-06-09 3 views
2

Например, предположим, что у меня есть функция:Возможна функция для издевательства, так что один параметр всегда установлен на указанное значение?

def foo(var1, var2): 
    print '%s, %s' % (var1, var2) 

это возможно с помощью Mock или другой инструмент, чтобы временно изменить функцию таким образом, что второе значение всегда устанавливается на некоторое значение, как lorem ipsum?

foo('hello', 'world') # prints "hello, lorem ipsum" 
foo('goonight', 'moon') # prints "goodnight, lorem ipsum" 

мне еще нужно будет изменить Foo(), даже если он вложен в другой функции/классе:

def greet(name): 
    foo('hello', name) 


greet('john') # prints "hello, lorem ipsum" 

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

Спасибо!

ответ

0

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

original_foo = foo 
# Or whatever name actually needs to be patched 
with mock.patch('__main__.foo', lambda x, y: original_foo(x, 'lorem ipsum')): 
    # do stuff involving foo 

Важно то, что исправленный объект не может ссылаться на foo непосредственно, так как поиск имени foo будет происходить в условиях, когда имя foo уже исправленные, что приводит к бесконечному циклу.

 Смежные вопросы

  • Нет связанных вопросов^_^