Существует ли шаблонный шаблон для TDD-подхода в Django-Python

Я работаю над сайд-проектом и пытаюсь приучить себя к TDD-подходу в Django.

Я не уверен, почему я столкнулся с этим неудачным тестом

(venv) osahenru@osahenru ~/D/q-4> pytest -k test_can_post_questions
============================= test session starts ==============================
platform linux -- Python 3.10.12, pytest-8.1.1, pluggy-1.5.0
django: version: 5.0.4, settings: config.settings (from ini)
rootdir: /home/osahenru/Documents/q-4
configfile: pytest.ini
plugins: django-4.8.0
collected 5 items / 4 deselected / 1 selected                                  

app/tests/test_views.py F                                                [100%]

=================================== FAILURES ===================================
______________________ TestEvent.test_can_post_questions _______________________

self = <test_views.TestEvent testMethod=test_can_post_questions>

    def test_can_post_questions(self):
        event = Event.objects.create(name='Python Ghana')
        data = {
            'text': 'how are you?',
        }
        response = self.client.post(reverse('questions', kwargs={'pk': event.id}), data)
>       self.assertIsInstance(response.context['form'], QuestionCreateForm)
E       TypeError: 'NoneType' object is not subscriptable

app/tests/test_views.py:52: TypeError
=========================== short test summary info ============================
FAILED app/tests/test_views.py::TestEvent::test_can_post_questions - TypeError: 'NoneType' object is not subscriptable
======================= 1 failed, 4 deselected in 0.53s ========================
(venv) osahenru@osahenru ~/D/q-4 [0|1]> 

вот тест, вызывающий сообщение об ошибке

def test_can_post_questions(self):
        event = Event.objects.create(name='Python Ghana')
        data = {
            'text': 'how are you?',
        }
        response = self.client.post(reverse('questions', kwargs={'pk': event.id}), data)
        self.assertIsInstance(response.context['form'], QuestionCreateForm)
        self.assertEqual(response.status_code, 302)

и вот функция просмотра

def questions(request, pk):
    event = Event.objects.get(id=pk)
    questions = Question.objects.filter(event=event)
    
    form = QuestionCreateForm()
    if request.method == 'POST':
        form = QuestionCreateForm(request.POST)
        if form.is_valid():
            question = form.save(commit=False)
            question.event = event
            question.save()
            return redirect('questions', pk=pk)
        
    context = {
        'form': form,
        'questions': questions,
        'event': event
    }
    return render(request, 'questions.html', context)

Также, как новичок в TDD подходе, есть ли шаблон для написания юнит-тестов в целом и конкретно для Django? Мне очень сложно разобраться с этой концепцией. Спасибо

Тестируемый здесь ответ - это редирект после сообщения, у которого нет контекста. Если вы хотите посмотреть на контекст финального ответа, вам нужно добавить follow=True к вызову self.client.post( - смотрите документацию для получения дополнительной информации о клиентских args

Что касается шаблонов, то главное правило, которое я использую: если я это написал, то я это и тестирую. Так что вам не нужно проверять способность формы отправляться, поскольку django справляется с этим и, надеюсь, уже хорошо протестирован. Используя ваш код в качестве примера, я бы проверил, что элемент question.event добавляется как положено, поскольку это ваше собственное дополнение к стандартному процессу отправки формы.

Вернуться на верх