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') == {}
Вернуться на верх