Как получить экземпляр пользователя в Django tests.py?

Я начинающий Django, я создал простое приложение для электронной коммерции и пишу несколько тестов в tests.py. Я пытаюсь написать тест, который проверяет правильность создания OrderItem, но я не знаю, как получить экземпляр пользователя . Должен ли я проверять вошедшего в систему пользователя или достаточно существования пользователя?

Это мой store/models.py:

from tkinter import CASCADE
from django.db import models
from django.conf import settings

class Item(models.Model):
    name = models.CharField(max_length=50)
    price = models.FloatField()

    def __str__(self):
       return self.name

class OrderItem(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    ordered = models.BooleanField(default=False)

    def __str__(self):
       return f"{self.quantity} of {self.item.name}"

    @property
    def get_total_price(self):
       return self.quantity*self.item.price

И этот store/tests.py:

def create_item(name='cintura', price=10):
   return Item.objects.create(name=name, price=price)

def get_user():
   return User.objects.get(username='foo')

def create_orderitem(quantity=2, user=get_user(), ordered=False):
    item = create_item()
    return OrderItem.objects.create(item=item, quantity=quantity, user=user, ordered=ordered)

class OrderItemModelTest(TestCase):

   def test_orderitem_creation(self):
       order_item = create_orderitem()
       self.assertFalse(order_item.ordered)
       self.assertGreater(order_item.quantity, 0, 'Quantity must be > 0')
       #put here user check

Это ошибка:

django.db.utils.IntegrityError: The row in table 'store_orderitem' with primary key '1' has an invalid foreign key: store_orderitem.user_id contains a value '1' that does not have a corresponding value in auth_user.id.

Вам нужно что-то вроде этого:

def setUp(self):
        self.user = User.objects.create_user(username='testuser', password='password')
        factory = RequestFactory()
        request = factory.get('')
        request.user = self.user
        self.client.login(username='testuser', password='password')

В своих тестах используйте self.client в качестве готового пользователя.

Django очищает базу данных между тестами. Если вы вызываете свою get_user() уже в сигнатуре функции, она будет выполнена до класса теста. Если вы хотите сохранить вашу структуру такой, как она есть сейчас, вы должны переместить ее в функцию:

def create_orderitem(quantity=2, user=None, ordered=False):
    if user is None:
        user = get_user()
    item = create_item()
    return OrderItem.objects.create(item=item, quantity=quantity, user=user, ordered=ordered)
Вернуться на верх