代码之家  ›  专栏  ›  技术社区  ›  KenFar

测试实例方法而不运行\ init的最佳方法__

  •  3
  • KenFar  · 技术社区  · 14 年前

    我有一个简单的类,它通过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 回复  |  直到 14 年前
        1
  •  3
  •   Ignacio Vazquez-Abrams    14 年前

    对于新样式的类,请致电 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
    
        2
  •  4
  •   Hank Gay    14 年前

    为什么这个类的可用性会受到影响?如果所有 __init__ 正在做的是预计算,以便您可以将值作为简单变量公开,将这些变量更改为 properties 在getter中进行计算(可能缓存/内存化)。这样你 爱因斯坦 方法返回到只进行初始化,并且提高了可测试性。

    这种方法的缺点是 可以 表现欠佳,但可能不太明显。