Предыстория проблемы
существовать Тестовая последовательность вызова функции в Python является общим требованием. Например, у вас может быть объект Obj
,в Сумка Содержит три метода:method1
、method2
и method3
。Вы также написали функцию do_something
,Функция вызывает эти методы. Вы хотите написать тест, который проверяет do_something
Функция и Obj
объект. Однако вы не хотите напрямую моделировать или изменять Obj
поведение объекта. Вам нужен способ обрести существование obj
Список методов, которые можно вызвать для объекта без изменения его поведения.
решение
Способ первый: использовать trace
Сумка
Вы можете использовать trace
Сумкаполучитьсуществовать obj
на объектевызов Список методов。trace
Сумка - это Python Встроенные инструменты отладки,Он позволяет отслеживать выполнение функциивызовивозвращаться。
Чтобы использовать trace
Сумка, сначала тебе нужно его установить. Вы можете используйте следующую команду для установки trace
Сумка:
pip install trace
После завершения установки вы можете использовать trace
Сумка Понятно。Вот как использовать trace
Сумкаполучитьсуществовать obj
Список методов, вызываемых у объекта:
import sys
import trace
# Создайте Trace Object, сообщая ему, какие каталоги игнорировать и следует ли выполнять отслеживание или подсчет строк.
tracer = trace.Trace(
ignoredirs=[sys.prefix, sys.exec_prefix],
trace=0,
count=1)
# использовать Запускает новую команду для данного трекера.
tracer.run('main()')
# Создайте отчет и поместите выходные данные в текущий каталог.
r = tracer.results()
r.write_results(show_missing=True, coverdir=".")
trace
Сумка сформирует отчет, в котором Сумка содержит существующие obj
Список методов, вызываемых для объекта. Вы можете используйте этот отчет для проверки do_something
Функция и Obj
объект.
Метод 2: Используйте Wrapper
добрый
Вы также можете создать общий Wrapper
добрыйинкапсулировать ваш объект и отслеживать изменения в нем。Wrapper
добрый перехватывает все обращения к объекту и протоколирует их.
Вот как написать Wrapper
добрый:
class Obj:
def method1(self):
print 'method1'
def method2(self):
print 'method2'
def method3(self):
print 'method3'
class Wrapper:
def __init__(self, wrapped):
self.calls = []
self._wrapped = wrapped
def __getattr__(self, n):
self.calls.append(n)
return getattr(self._wrapped, n)
Чтобы использовать Wrapper
добрый, можно сделать так:
obj = Obj()
x = Wrapper(obj)
x.method2()
x.method1()
x.method3()
print(x.calls)
Выход:
['method2', 'method1', 'method3']
Вы можете использовать Wrapper
добрый тест do_something
Функция и Obj
объект.
пример кода
Вот как использовать trace
Сумкаи Wrapper
добрый тест do_something
Функция и Obj
Объект:
использовать trace
Сумка
import sys
import trace
class Obj:
def method1(self):
print 'method1'
def method2(self):
print 'method2'
def method3(self):
print 'method3'
def do_something():
obj = Obj()
obj.method2()
obj.method1()
obj.method3()
# Создайте Trace Object, сообщая ему, какие каталоги игнорировать и следует ли выполнять отслеживание или подсчет строк.
tracer = trace.Trace(
ignoredirs=[sys.prefix, sys.exec_prefix],
trace=0,
count=1)
# использовать Запускает новую команду для данного трекера.
tracer.run('do_something()')
# Создайте отчет и поместите выходные данные в текущий каталог.
r = tracer.results()
r.write_results(show_missing=True, coverdir=".")
использовать Wrapper
добрый
class Obj:
def method1(self):
print 'method1'
def method2(self):
print 'method2'
def method3(self):
print 'method3'
class Wrapper:
def __init__(self, wrapped):
self.calls = []
self._wrapped = wrapped
def __getattr__(self, n):
self.calls.append(n)
return getattr(self._wrapped, n)
def do_something():
obj = Obj()
obj.method2()
obj.method1()
obj.method3()
# Создайте Wrapper объект и использовать его для инкапсуляции Obj объект.
x = Wrapper(obj)
# вызов do_something() функция.
do_something()
# распечататьсуществовать Obj на объектевызов Список методов。
print(x.calls)
Выход:
['method2', 'method1', 'method3']