Django Unit Test - отфильтрованные результаты запроса
Я относительно новичок в Django и очень новичок в написании модульных тестов. Я хотел бы попросить помощи, но немного не понимаю, с чего начать. Приложение, о котором идет речь, позволяет учителю назначать несколько заданий ученику. На панели ученика задание должно быть доступно, только если дата начала <= сегодняшней дате. Ученик должен видеть только первое задание в списке на своей приборной панели.
Мне нужно составить модульный тест для такого сценария: я хочу назначить несколько заданий студенту, а затем использовать тот же запрос, который используется для приборной панели студента, чтобы убедиться, что возвращаются только задания с датой начала <= сегодняшняя дата, и что студент видит только первое задание (с самой ранней датой начала) в списке.
Ниже я разместил соответствующий код, который извлекает то, что отображается на приборной панели студента. Пожалуйста, дайте мне знать, если требуется дополнительный код, чтобы помочь мне начать работу с этим. Большое спасибо за любую помощь, которую вы можете предложить!
из моего файла home/views.py
@login_required
def index(request):
user_type = request.user.type.text
if user_type == 'Student':
""" Only return the first test so the student sees one test at a time"""
assignment = Assignment.objects.filter(
student=request.user,
start_date__lte=datetime.date.today(),
completed=False).first()
if (assignment):
context = {
'test_pk': assignment.test.pk,
}
else:
context = {}
return render(request, 'home/student.html', context)
Основы тестирования подобных вещей выглядят примерно так:
- Создайте нужные данные вручную
- Создайте действие/условия, происходящие в представлении (возможно, отправьте запрос в представление)
- Проверьте результат с ранее созданными вручную данными.
Итак, начните с создания некоторых объектов Задания для студентов. Запустите ваше представление (отправьте запрос вашему представлению, войдя в систему как ранее созданный пользователь). Проверьте, существует ли желаемый результат в возвращенном html.
Я бы посоветовал вам использовать для этого pytest и factoryboy, в сети есть много отличных руководств по их использованию с Django.
Для вашего примера это будет выглядеть примерно так Сначала нужно инициировать сессию, для этого мы можем создать приспособление
import pytest
import factory
@pytest.fixture
def client():
from django.test.client import Client
return Client(HTTP_USER_AGENT='pytest')
тогда мы должны инициировать сессию, другое приспособление:
@pytest.fixture
def session(client):
# your custom session her
user = #use factory for the user
client.user = user
# your defaults for
# client.GET
# client.POST
# client.META
return client
class AssignmentFactory(factory.django.DjangoModelFactory):
class Meta:
model = Assignment
django_get_or_create = ('any attribute you like',)
# default the attributes you want to create here
# For example
name = "assignment one"
Тогда тест может быть примерно таким
@pytest.mark.django_db
def test_retrieve_assignment_success(session):
path = reverse("view_name")
assignment = AssignmentFactory()
res = session.get(path=path, data={}, follow=False)
json_res = res.json()
assert json_res.get('context') is not None
assert assigment.pk == json_res.get('context').get('test_pk')
@pytest.mark.django_db
def test_retrieve_assignment_fail(session):
path = reverse("view_name")
res = session.get(path=path, data={}, follow=False)
json_res = res.json()
assert json_res.get('context') is not None
assert json_res.get('context') == {}