如何删除Python类中self的隐式传递?

时间:2019-04-05 01:45:27

标签: python unit-testing inheritance

我已经进行了一系列测试,并且发现我正在类之间复制/粘贴很多代码,因此我想创建一个基类来删除它。

要有效地执行此操作,我需要使被测模块的函数能够被基类访问。看起来应该很简单,但是我发现如果子类指定一个全局变量作为要测试的函数,则基类在调用它时会将“ self”作为参数零插入,产生TypeError: FooBar() takes exactly 2 arguments (3 given)

我的代码:

import unittest    
import moduleOfFunctionsToTest as uut

class Base_Test_Class( unittest.TestCase ):
  def setUp( self ):
    # Common test suite setup
    return

  def runFcn( self ):
    return self.uutFcn( "foo", self.bar )

  # other common fucntions.

class TheFirstTestClass( Base_Test_Class ):
  uutFcn = uut.FooBar
  bar = "0"

  def test_SomeCode( self ):
    self.runFcn

如何在不插入self.uutFcn的情况下呼叫self?我尝试过通过构造函数传递值,但这引起了其他麻烦(如果那是正确的方法,我可能需要重新考虑一下。)

TIA!

1 个答案:

答案 0 :(得分:1)

一种解决方法是在uutFcn的定义中使用staticmethod

import unittest    
import moduleOfFunctionsToTest as uut

class Base_Test_Class( unittest.TestCase ):
  def setUp( self ):
    # Common test suite setup
    return

  def runFcn( self ):
    return self.uutFcn( "foo", self.bar )

  # other common fucntions.

class TheFirstTestClass( Base_Test_Class ):
  uutFcn = staticmethod(uut.FooBar)
  bar = "0"

  def test_SomeCode( self ):
    self.runFcn()

之所以行之有效,是因为staticmethod确保给定的函数始终在没有其他参数的情况下执行,无论您是通过类还是通过实例调用它,因此uut.FooBar的签名都将保持不变。