Python 单元测试抽象基类和子类
单元测试新手。我有一个抽象基类,有一个具体的公共方法和一个抽象的私有方法。几个子类实现此私有方法:Python 单元测试抽象基类和子类,python,unit-testing,inheritance,Python,Unit Testing,Inheritance,单元测试新手。我有一个抽象基类,有一个具体的公共方法和一个抽象的私有方法。几个子类实现此私有方法: @add_metaclass(ABCMeta) class Base(object): def concrete(self, x, y): x = self._abstract(x) return x, y @abstractmethod def _abstract(self, x): pass class Child
@add_metaclass(ABCMeta)
class Base(object):
def concrete(self, x, y):
x = self._abstract(x)
return x, y
@abstractmethod
def _abstract(self, x):
pass
class Child(Base):
def _abstract(self, x):
return x + 1
对这些类中的方法进行单元测试的最佳方法是什么?在我最初的尝试中,我创建了一个MockBase
和一组在BaseTests
中对原始基类的所有子类通用的测试(BaseTests
跳过测试以避免执行时的冗余)。子测试继承自BaseTests
class MockBase(Base):
def _abstract(self, x):
return x
class BaseTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
if cls is BaseTests:
raise unittest.SkipTest("Skipping BaseTests.")
super(BaseTests, cls).setUpClass()
def setUp(self):
super(BaseTests, self).setUp()
self.class_ = MockBase()
def test_concrete_returns_y(self):
_, y = self.class_.concrete(1, 1)
self.assertEqual(y, 1)
class TestChild(BaseTests):
def setUp(self):
super(TestChild, self).setUp()
self.class_ = Child()
def test_concrete_returns_x_plus_1(self):
x, _ = self.class_.concrete(1, 1)
self.assertEqual(x, 2)
这种方法似乎有效,但我想知道它是否是最优雅和可扩展的选项 我相信这已经在这里得到了回答。tl;dr是指您可以使用
unittests.mock.patch
清除基类中的所有抽象方法,以便对其进行实例化。