Отключение 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)

Это должным образом гарантирует, что планировщик запускается только один раз, даже при запуске набора тестов.

Другие вопросы по тегам