在Python中修补子类中的所有方法

2024-10-01 09:28:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很好的基本测试类,它扩展自django测试用例和另一个类:

 class MyTestCase(TestCase, TestFreshProvisionedEachTest):

现在一切都很好地工作,除了为了使它工作,我们必须(用Foord的模拟库)在中间件中修补几个函数。在

我的想法是这样会很好的:

^{pr2}$

但是它似乎不起作用,子类的方法没有被修补。 我当时就想有办法

MyTestCase = patch(MyTestCase, 'spotlight.middleware.extract_host_name', new=lambda host_name: TEST_DOMAIN)

但这也是不可能的。在

有没有办法避免这种重复,并在超类上做一个补丁 哪一个也修补了所有的子类方法?在


Tags: 中间件django方法函数namehost测试用例子类
1条回答
网友
1楼 · 发布于 2024-10-01 09:28:12

为此最好使用元类,因为它比手动应用装饰器更容易处理测试用例的继承。大致如下(我还没有测试过,但是你应该知道这个想法):

class TestMeta(type(TestCase)):
    def patch_method(cls, meth):
        raise NotImplementedError

    def __new__(mcls, name, bases, dct):
        to_patch = []

        for methname, meth in dct.items():
            if methname.startswith('test') and callable(meth):
                to_patch.append(methname)

        cls = super().__new__(mcls, name, bases, dct)

        for methname in to_patch:
            meth = getattr(cls, methname)
            meth = cls.patch_method(meth)
            setattr(cls, methname, meth)

        return cls

class PatchedTestCase(TestCase, metaclass=TestMeta):
    @classmethod
    def patch_method(cls, meth):
        meth = patch('spotlight.middleware.extract_host_name', 
                     new=lambda host_name: TEST_DOMAIN)(meth)

        meth = patch('spotlight.middleware.extract_host_key', 
                     new=lambda host_key: company_name_to_db(TEST_DOMAIN))(meth)

        return meth

class MyTestCase(PatchedTestCase, TestFreshProvisionedEachTest):
    ...

使用这种方法,PatchedTestCase的所有子类的所有方法都将被修补。您还可以使用不同的patch_method实现定义其他基类。在

相关问题 更多 >