1

我目前有一个 Pythonunittest测试用例,如下所示:

from unittest import TestCase as UTestCase

import inspect 

class BaseParentTaskTest(UTestCase):

    def test_case_one(self):
        class A(BaseParentTask):
            def run(self, a, b):
                pass

        instance = A()

        print inspect.getargspec(instance.run).args

        instance._validate()

        if instance.valid:
            self.fail("Failed to invalidate based on wrong argument count.")

    def test_case_two(self):
        class A(BaseParentTask):
            def run(self, a, b, c, d):
                pass

        instance = A()

        print inspect.getargspec(instance.run).args

        if instance.valid:
            self.fail("Failed to invalidate based on wrong argument kw names.")

从我的测试看来,在运行之后test_case_one,该类被保存在内存中,并且在运行时A不会被覆盖。这会导致失败。Atest_case_twotest_case_two

这可以从日志中看出。在test_case_one中,预期输出为(self, a, b),它是:

(self, a, b)

test_case_two中,预期输出为(self, a, b, c, d)

(self, a, b)

然而,显然不是。

为什么A实例方法一退出类就没有消失?我该如何解决这个问题以使我的测试通过?

4

1 回答 1

1

显然,Celery 是罪魁祸首,因为它在幕后做了一些奇怪的事情来实现这一点。

通过在每个子类上定义abstract类变量,问题就消失了:

class A(BaseParentTask):
    abstract = True
    def run(self, a, b, c, d):
        pass

我的理解是 Celery 不会对这个类做任何事情,除非它是用@celery.task注解注册的,但它似乎在内部仍然注册了这个类,没有任何明确的请求。

于 2013-05-27T00:33:03.693 回答