django -pytest ошибка при создании тестовой базы данных, содержащей поле многие ко многим - PullRequest
0 голосов
/ 26 марта 2020

У меня есть модель, имеющая много-много полей, как показано ниже. Я использую pytest для написания модульных тестов для него.

models.py

class CustomerMaster(models.Model):
    customer_key = models.IntegerField(db_column='CUSTOMER_KEY', primary_key=True)  # Field name made lowercase.
    first_name = models.TextField(db_column='FIRST_NAME', blank=True, null=True)  # Field name made lowercase.
    last_name = models.TextField(db_column='LAST_NAME', blank=True, null=True)  # Field name made lowercase.
    email = models.CharField(db_column='EMAIL', max_length=255, blank=True, null=True)  # Field name made lowercase.
    gender = models.TextField(db_column='GENDER', blank=True, null=True)  # Field name made lowercase.
    dob = models.DateField(db_column='DOB', blank=True, null=True)  # Field name made lowercase.
    phone = models.CharField(db_column='PHONE', max_length=255, blank=True, null=True)  # Field name made lowercase.
    address = models.TextField(db_column='ADDRESS', blank=True, null=True)  # Field name made lowercase.
  ...

    class Meta:
        managed = False
        db_table = 'customer_master'

    def __str__(self):
        return self.first_name + self.last_name

class Segment(models.Model):
    name = models.CharField(max_length=100)
    folder = models.CharField(max_length=100)
    selection = JSONField()
    createdAt = models.DateTimeField(null=True)
    updatedAt = models.DateTimeField(null=True)
    createdBy = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    contact = models.ManyToManyField(CustomerMaster)

    def __str__(self):
        return self.name

Мне нужно проверить, может ли только авторизованный пользователь получить доступ к представлению. Для этого я использую декоратор @login_required, предоставляемый самой django. Для создания фиктивного пользователя я использую следующее приспособление:

conftest.py

import uuid

import pytest


@pytest.fixture
def test_password():
   return 'strong-test-pass'

@pytest.fixture
def create_user(db, django_user_model, test_password):
   def make_user(**kwargs):
       kwargs['password'] = test_password
       if 'username' not in kwargs:
           kwargs['username'] = str(uuid.uuid4())
       return django_user_model.objects.create_user(**kwargs)
   return make_user

@pytest.fixture
def auto_login_user(db, client, create_user, test_password):
   def make_auto_login(user=None):
       if user is None:
           user = create_user()
       client.login(username=user.username, password=test_password)
       return client, user
   return make_auto_login

мой тестовый пример:

    @pytest.mark.django_db
    def test_status(self, auto_login_user):
        client, user = auto_login_user()
        url = reverse("overview", kwargs={"pk": 1})
        response = client.get(url)
        assert response.status_code == 200

Но во время выполнения этого тестового примера pytest выдает мне следующую ошибку:

django.db.utils.OperationalError: (1824, "Failed to open the referenced table 'customer_master'")

Когда я проверял свою базу данных, база данных test_img частично создается с таблицей сегментов, но не customer_master. Он выдает ошибку при создании сквозной таблицы связи между многими (например, analytics_segment_contact) между сегментом и customer_master.

Любая помощь будет оценена. Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...