Отключение tgscheduler во время тестирования носа
У меня есть проект TurboGears 2.3.6, над которым я работаю уже довольно давно. В моем проекте я использую tgscheduler.
Я хочу научиться использовать тесты, и у меня есть некоторые трудности с началом. Когда я бегу
nosetests –v
Я получаю эту ошибку для всех тестов по умолчанию, которые идут с Turbogears:
ValueError: A task with the name NameOfMyTask already exists
И тест не пройден.
Могу ли я сказать носу игнорировать tgscheduler как-то?
Спасибо
1 ответ
Набор тестов в TurboGears создает новый экземпляр приложения для каждого теста, чтобы тесты выполнялись в отдельной и изолированной среде. По этой причине AppGlobals
создаются несколько раз (по одному для каждого приложения).
В то время как в документации говорится, что планировщик запускается в AppGlobals.__init__
, который работает в простых случаях, имеет побочный эффект многократного запуска планировщика, когда внутри одного интерпретатора Python создается более одного экземпляра приложения TurboGears (что происходит при запуске набора тестов).
Я предлагаю вам запустить планировщик через этап, который гарантированно будет запускаться только один раз для каждого интерпретатора Python ( http://turbogears.readthedocs.org/en/latest/turbogears/configuration/appconfig.html)
Просто отредактируйте свой 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)
Это должным образом гарантирует, что планировщик запускается только один раз, даже при запуске набора тестов.