Как получить экземпляр пользователя в 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)