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
清除基类中的所有抽象方法,以便对其进行实例化。