我有一个TurboGears 2.3.6项目,我已经工作了很长一段时间。在我的项目中,我使用了tgscheduler。
我想学习如何使用测试,但是我在启动时遇到了一些困难。 我跑的时候
nosetests –v
我对Turbogears附带的所有默认测试都有这个错误:
ValueError: A task with the name NameOfMyTask already exists
测试失败。
我可以告诉鼻子以某种方式忽略tgscheduler吗?
由于
答案 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)
这将正确地确保即使在运行测试套件时调度程序也只启动一次。