0

我有一个对象

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']
4

2 回答 2

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=".")
于 2013-06-26T16:06:31.097 回答
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满足您的需求。(记录方法调用的时间戳、记录输出、记录到数据库等)

于 2013-06-26T16:10:32.453 回答