Как удалить неявную передачу себя в классе Python? - PullRequest
2 голосов
/ 05 апреля 2019

У меня есть набор тестов, и я обнаружил, что я копирую / вставляю много кода из класса в класс, поэтому я хочу создать базовый класс, чтобы удалить это.

Чтобы сделать это эффективно, мне нужно сделать функцию тестируемого модуля доступной для базового класса.Кажется, что это должно быть просто сделать, но я обнаружил, что если мой дочерний класс задает глобальную переменную, которая является функцией для тестирования, базовый класс, когда он ее вызывает, вставляет «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 Ответ

1 голос
/ 08 апреля 2019

Один из способов решить эту проблему - использовать staticmethod в определении uutFcn:

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 останется неизменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...