Django: объект не может быть найден - PullRequest
0 голосов
/ 30 мая 2018

Я нигде не видел, чтобы LiveServerTestCase не загружал приборы, но когда я выполняю следующее:

class FrontTest(LiveServerTestCase):

    fixtures = ['event.json']


    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        print(Event.objects.all())

Вывод:

Using existing test database for alias 'default'...
[]

Когда я используюTestCase

class FrontTest(TestCase):

    fixtures = ['event.json']


    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        print(Event.objects.all())

Выход:

[<Event: event search>]

Знаете ли вы, почему мой прибор загружается только в TestCase?Я бы очень хотел заставить его работать на Selenium.Спасибо!

PS: event.json :

{
       "model": "mezzanine_agenda.event",
       "pk": 1,
       "fields": {
          "comments_count": 0,
          "keywords_string": "",
          "rating_count": 0,
          "rating_sum": 0,
          "rating_average": 0.0,
          "site": 1,
          "title": "event search",
          "slug": "event-search",
          "_meta_title": "",
          "description": "event search",
          "gen_description": true,
          "created": "2018-05-25T15:49:55.223Z",
          "updated": "2018-05-25T15:49:55.257Z",
          "status": 2,
          "publish_date": "2018-05-25T15:49:32Z",
          "expiry_date": null,
       }
    }, 

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Это потому, что TransactionTestCase загружает приборы в экземпляре метода setUp, поэтому его дочерние классы, включая LiveServerTestCase, делают то же самое - за исключением TestCase, который использует одну атомарную транзакцию для каждого класса и загружает приборы в setUpClass ускорить выполнение теста.Это поведение было добавлено в # 20392 .

. Для вас это означает, что вы должны переместить весь код, связанный с базой данных, с setupClass на setUp в дочерних классах LiveServerTestCase:

class FrontendLiveTest(LiveServerTestCase):

    def setUp(self):
        # the transaction is opened, fixtures are loaded
        assert Event.objects.exists()

Примечание

В случае, если вы попытаетесь смешать атомарные транзакции TestCase с фоновыми потоками LiveServerTestCase: как указано в LiveServerTestCase документах,

Он наследуется от TransactionTestCase вместо TestCase, поскольку потоки не разделяют одни и те же транзакции (если только не используется in-memory sqlite), и каждый поток должен зафиксировать все свои транзакции, чтобыдругой поток может видеть изменения.

0 голосов
/ 30 мая 2018

Во-первых, и, к сожалению, Django игнорирует приборы, которые он не находит.Ошибка, которую вы видите, означает, что Django не может найти файл фикстура и выдает ошибку: https://code.djangoproject.com/ticket/18990

Вот как Django находит фикстуры:
  • Использование абсолютных путей к файлам фикстур, не очень хорошая идеяпоскольку прибор, вероятно, помещен как часть кода -> он переопределит вторую технику
  • Он просматривает все каталоги, определенные в settings.FIXTURE_DIRS
  • Он просматривает все каталоги приложений в папке с именем fixtures по соглашению.

Исходя из этого, посмотрите, где находится ваш файл, и вы можете получить исправление по этому вопросу

Вот Djangoкод для fixture_dirs:

@cached_property
def fixture_dirs(self):
    """
    Return a list of fixture directories.

    The list contains the 'fixtures' subdirectory of each installed
    application, if it exists, the directories in FIXTURE_DIRS, and the
    current directory.
    """
    dirs = []
    fixture_dirs = settings.FIXTURE_DIRS
    if len(fixture_dirs) != len(set(fixture_dirs)):
        raise ImproperlyConfigured("settings.FIXTURE_DIRS contains duplicates.")
    for app_config in apps.get_app_configs():
        app_label = app_config.label
        app_dir = os.path.join(app_config.path, 'fixtures')
        if app_dir in fixture_dirs:
            raise ImproperlyConfigured(
                "'%s' is a default fixture directory for the '%s' app "
                "and cannot be listed in settings.FIXTURE_DIRS." % (app_dir, app_label)
            )

        if self.app_label and app_label != self.app_label:
            continue
        if os.path.isdir(app_dir):
            dirs.append(app_dir)
    dirs.extend(list(fixture_dirs))
    dirs.append('')
    dirs = [upath(os.path.abspath(os.path.realpath(d))) for d in dirs]
    return dirs
...