不运行__init__测试实例方法的最佳方法

时间:2010-05-18 17:08:04

标签: python unit-testing

我有一个简单的类,它通过init获取大部分参数,它还运行各种私有方法来完成大部分工作。输出可通过访问对象变量或公共方法获得。

这就是问题 - 我希望我的unittest框架直接调用init调用的私有方法,使用不同的数据 - 而不是通过init。

最好的方法是什么?

到目前为止,我一直在重构这些类,以便init做得更少,数据分别传入。这使得测试变得简单,但我认为该类的可用性受到了一些影响。

编辑:基于Ignacio答案的示例解决方案:

import types

class C(object):

   def __init__(self, number):
       new_number = self._foo(number)
       self._bar(new_number)

   def _foo(self, number):
       return number * 2

   def _bar(self, number):
       print number * 10

#--- normal execution - should print 160: -------
MyC = C(8)

#--- testing execution - should print 80 --------
MyC = object.__new__(C)
MyC._bar(8)

2 个答案:

答案 0 :(得分:4)

为什么班级的可用性必须受到影响?如果所有__init__正在进行预先计算,那么您可以将值公开为简单变量,将这些变量更改为properties并在getter中进行计算(可能是缓存/ memoized)。这样,您的__init__方法又回到了初始化状态,并且可测试性得到了提升。

这种方法的缺点是可能性能较差,但可能不是很大程度。

答案 1 :(得分:3)

对于新式类,请调用object.__new__(),将该类作为参数传递。对于旧式类,请调用types.InstanceType()将类作为参数传递。

import types

class C(object):
  def __init__(self):
    print 'init'

class OldC:
  def __init__(self):
    print 'initOld'

c = object.__new__(C)
print c

oc = types.InstanceType(OldC)
print oc