在 运行 nosetests 时禁用 tgscheduler

Disabling tgscheduler while running nosetests

我有一个 TurboGears 2.3.6 项目,我已经为此工作了很长时间。在我的项目中,我使用的是 tgscheduler。

我想学习如何使用测试,但开始有些困难。 当我 运行

nosetests –v

我在 Turbogears 附带的所有默认测试中都遇到了这个错误:

ValueError: A task with the name NameOfMyTask already exists

测试失败。

我可以告诉 nose 以某种方式忽略 tgscheduler 吗?

谢谢

TurboGears 中的测试套件为每个测试创建一个新的应用程序实例,因此测试 运行 在一个分离和隔离的环境中。因此 AppGlobals 被多次创建(每个应用程序一个)。

虽然文档说明在 AppGlobals.__init__ 中启动调度程序,这在简单的情况下有效,但当在同一内部创建多个 TurboGears 应用程序实例时,它具有多次启动调度程序的副作用Python 解释器(当你 运行 测试套件时发生的事情)。

我建议你通过一个里程碑来启动调度程序,保证每个python解释器只运行一次(http://turbogears.readthedocs.org/en/latest/turbogears/configuration/appconfig.html#configuration-milestones )

只需编辑您的 config/app_cfg.py 并在末尾添加以下代码以启动调度程序:

def start_tgscheduler():
    from tgscheduler import start_scheduler
    from tgscheduler.scheduler import add_interval_task

    start_scheduler()

    def testTask():
        print 'HELLO'
    add_interval_task(action=testTask, taskname="test1", interval=10, initialdelay=5)

from tg.configuration import milestones
milestones.config_ready.register(start_tgscheduler)

这将正确地确保即使在 运行测试套件时调度程序只启动一次。