运行nosetests时禁用tgscheduler

时间:2015-08-19 13:37:17

标签: nose turbogears2

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

我想学习如何使用测试,但是我在启动时遇到了一些困难。 我跑的时候

nosetests –v

我对Turbogears附带的所有默认测试都有这个错误:

ValueError: A task with the name NameOfMyTask already exists

测试失败。

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

由于

1 个答案:

答案 0 :(得分:1)

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

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

我建议您通过里程碑启动调度程序,保证每个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)

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