我有一个对象
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()
我想编写测试do_something和Obj对象的测试。 如何在不替换(模拟)和更改obj行为的情况下接收在obj上调用的方法列表?
像
这样的东西['method2', 'method1', 'method3']
答案 0 :(得分:1)
使用trace
包。请参阅文档:http://docs.python.org/2/library/trace.html
来自文档:
import sys
import trace
# create a Trace object, telling it what to ignore, and whether to
# do tracing or line-counting or both.
tracer = trace.Trace(
ignoredirs=[sys.prefix, sys.exec_prefix],
trace=0,
count=1)
# run the new command using the given tracer
tracer.run('main()')
# make a report, placing output in the current directory
r = tracer.results()
r.write_results(show_missing=True, coverdir=".")
答案 1 :(得分:1)
您可以创建一个通用的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)
通过重新定义__getattr__
,我们使包装器上的所有属性访问都检索包装对象中的属性。通过以上定义,我可以执行以下操作:
>>> obj = Obj()
>>> x = Wrapper(obj)
>>> x.calls
[]
>>> x.method2()
method 2
>>> x.method1()
method 1
>>> x.method3()
method 3
>>> x.calls
['method2', 'method1', 'method3']
>>> x.method1()
method 1
>>> x.method1()
method 1
>>> x.calls
['method2', 'method1', 'method3', 'method1', 'method1']
您可以在__getattr__
中进一步改进Wrapper
以满足您的需求。 (记录方法调用的时间戳,记录输出,记录到数据库等)