Изменение настроек для тестов в django (поисковая система для стога сена, чтобы быть конкретным) - PullRequest
4 голосов
/ 23 ноября 2011

У меня есть проект, который использует поисковую систему SOLR через django-haystack.Поисковая система находится на другом работающем сервере, и прикасаться к нему во время теста нежелательно (на самом деле это невозможно, поскольку доступ к этому хосту защищен брандмауэром)

Я использую стандартный тестер django.К счастью, он дает мне настройки тестового объекта, которые я могу изменить по своему вкусу, но оказывается, что это не конец истории.

Многие вещи в django-haystack создаются во время импорта,поэтому к тому времени, когда я изменяю настройки тестов в моем организаторе тестов, уже слишком поздно, и, несмотря на то, что я заменяю SEARCH_BACKEND на фиктивный, тесты по-прежнему вызывают SOLR.Проблема не является специфичной для HAYSTACK - такая же проблема происходит с mongoengine.Любые операторы уровня класса (например, CharField (default = Blah.objects.find (...))) выполняются во время создания экземпляра, прежде чем django сможет изменить настройки.

Конечно, кореньпроблема заключается в том, что настройки Django представляют собой страшный глобально изменяемый беспорядок и что Django не предоставляет централизованного места для кода реализации.Учитывая это, есть ли какие-либо предложения о том, какое тестовое решение будет самым простым?В данный момент я думаю о сценарии оболочки, который изменит переменную среды DJANGO_SETTINGS на test_settings и запустит тест ./manage.py впоследствии.Было бы лучше, если бы я все еще мог делать что-то через ./manage.py.

Есть идеи получше?Люди с похожими проблемами?

1 Ответ

0 голосов
/ 29 марта 2012

Я взял ответ от здесь и немного его изменил.Это прекрасно работает для меня:

from contextlib import contextmanager

@contextmanager
def connection(**kwargs):
    from haystack import connections

    for key, new_value in kwargs.items():
        setattr(connections, key, new_value)
        connections['default'].options['URL'] = connections.connections_info['default']['URL']
    yield

Мой тест выглядит следующим образом:

def test_job_detail_by_title_slug_job_id(self):
    with connection(connections_info=solr_settings.HAYSTACK_CONNECTIONS):
        resp = self.client.get('/0/rts-crb-unix-production-engineer/27216666/job/')
        self.assertEqual(resp.status_code, 404)
        resp = self.client.get('/indianapolis/indiana/usa/jobs/')
        self.assertEqual(resp.status_code, 200)
...