Как протестировать представление в Django

Я изучаю основы Django, следуя официальному руководству, и добавляю некоторые новые функции в свое приложение. Я добавил представление, которое может обнулить все голоса по определенному вопросу

def nullask(request, question_id):
    question=get_object_or_404(Question, pk = question_id)
    if request.method == "GET":
        return render(request, "polls/nullifyask.html", {"question":question})
    else:
        for i in question.choice_set.all():
            i.votes = 0
            i.save()
        return HttpResponseRedirect(reverse("polls:index"))

Так что все работает нормально, но я хотел попрактиковаться в написании тестов и хотел написать тест, который проверял бы, что голоса действительно обнулены. Вот он

class NullingViewTest(TestCase):
    def test_nulling(self):
        q=create_question(text="Future", days=-1)
        choice=q.choice_set.create(choice_text="1", votes=10)
        response=self.client.post(reverse('polls:nullask', args=(q.id,)))
        self.assertEqual(choice.votes, 0)

Не работает (голоса не меняются с 10 на 0 и появляется AssertionError: 10 != 0 . Я понимаю, почему это происходит, но не могу заставить его работать так, как я хочу. Что я должен сделать вот nullify ask.html:

<!doctype html>
<html lang="en-US">
  <head>
    <meta charset="utf-8" />
    <title>Nullyfying of {{question_id}}</title>
  </head>
  <body>
    <form method="post">
      {% csrf_token %}
        <legend><h1>Do you want to nullify votes of question {{question.text}}</h1></legend>
        <input type="submit" name="Yes" value="Yes!">
    </form>
  </body>
</html>

Вот модели:

class Question(models.Model):
    text=models.CharField(max_length=200)
    productiondate=models.DateTimeField("date published")

    def was_published_recently(self):
        return self.productiondate >= timezone.now() - datetime.timedelta(days=1) and self.productiondate<timezone.now()
    def __str__(self):
        return self.text
    class Meta:
        permissions=(("can_nullify","User can nullify votes" ),)
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def votesx2(self):
        return self.votes*2
    def __str__(self):
        return self.choice_text

Я попробовал использовать question=response.context['question'] в тесте, но это привело к ошибке

В вашем тесте вам нужно обновить объект choice Python, чтобы отразить обновленный подсчет голосов в базе данных. Это можно сделать, вызвав refresh_from_db() на объекте в вашем тесте после POST на nullask.

class NullingViewTest(TestCase):
    def test_nulling(self):
        q=create_question(text="Future", days=-1)
        choice=q.choice_set.create(choice_text="1", votes=10)
        response=self.client.post(reverse('polls:nullask', args=(q.id,)))
        
        # Update the Python object to reflect changes in the database
        choice.refresh_from_db()
        
        self.assertEqual(choice.votes, 0)
Вернуться на верх