在 运行 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)
这将正确地确保即使在 运行测试套件时调度程序只启动一次。
我有一个 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)
这将正确地确保即使在 运行测试套件时调度程序只启动一次。