Tutorial 5, error "Unresolved reference 'create_question' in tests.py"

I met a problem when writing tests for a site from tutorial 5, everything is written exactly the same as in the tutorial, “create_question” does not want to work.

CODE:
import datetime

from django.test import TestCase
from django.utils import timezone
from django.urls import reverse

from .models import Question

class QuestionModelTests(TestCase):

def test_was_published_recently_with_future_question(self):
    """
    was_published_recently() returns False for questions whose pub_date
    is in the future.
    """
    time = timezone.now() + datetime.timedelta(days=30)
    future_question = Question(pub_date=time)
    self.assertIs(future_question.was_published_recently(), False)

def test_was_published_recently_with_old_question(self):
    """
    was_published_recently() returns False for questions whose pub_date
    is older than 1 day.
    """
    time = timezone.now() - datetime.timedelta(days=1, seconds=1)
    old_question = Question(pub_date=time)
    self.assertIs(old_question.was_published_recently(), False)

def test_was_published_recently_with_recent_question(self):
    """
    was_published_recently() returns True for questions whose pub_date
    is within the last day.
    """
    time = timezone.now() - datetime.timedelta(hours=23, minutes=59, seconds=59)
    recent_question = Question(pub_date=time)
    self.assertIs(recent_question.was_published_recently(), True)

def create_question(question_text, days):
    """
    Create a question with the given `question_text` and published the
    given number of `days` offset to now (negative for questions published
    in the past, positive for questions that have yet to be published).
    """
    time = timezone.now() + datetime.timedelta(days=days)
    return Question.objects.create(question_text=question_text, pub_date=time)

class QuestionIndexViewTests(TestCase):
def test_no_questions(self):
“”"
If no questions exist, an appropriate message is displayed.
“”"
response = self.client.get(reverse(‘polls:index’))
self.assertEqual(response.status_code, 200)
self.assertContains(response, “No polls are available.”)
self.assertQuerysetEqual(response.context[‘latest_question_list’], )

def test_past_question(self):
    """
    Questions with a pub_date in the past are displayed on the
    index page.
    """
    question = create_question(question_text="Past question.", days=-30)
    response = self.client.get(reverse('polls:index'))
    self.assertQuerysetEqual(
        response.context['latest_question_list'],
        [question],
    )

def test_future_question(self):
    """
    Questions with a pub_date in the future aren't displayed on
    the index page.
    """
    create_question(question_text="Future question.", days=30)
    response = self.client.get(reverse('polls:index'))
    self.assertContains(response, "No polls are available.")
    self.assertQuerysetEqual(response.context['latest_question_list'], [])

def test_future_question_and_past_question(self):
    """
    Even if both past and future questions exist, only past questions
    are displayed.
    """
    question = create_question(question_text="Past question.", days=-30)
    create_question(question_text="Future question.", days=30)
    response = self.client.get(reverse('polls:index'))
    self.assertQuerysetEqual(
        response.context['latest_question_list'],
        [question],
    )

def test_two_past_questions(self):
    """
    The questions index page may display multiple questions.
    """
    question1 = create_question(question_text="Past question 1.", days=-30)
    question2 = create_question(question_text="Past question 2.", days=-5)
    response = self.client.get(reverse('polls:index'))
    self.assertQuerysetEqual(
        response.context['latest_question_list'],
        [question2, question1],
    )

class QuestionDetailViewTests(TestCase):
def test_future_question(self):
“”"
The detail view of a question with a pub_date in the future
returns a 404 not found.
“”"
future_question = create_question(question_text=‘Future question.’, days=5)
url = reverse(‘polls:detail’, args=(future_question.id,))
response = self.client.get(url)
self.assertEqual(response.status_code, 404)

def test_past_question(self):
    """
    The detail view of a question with a pub_date in the past
    displays the question's text.
    """
    past_question = create_question(question_text='Past Question.', days=-5)
    url = reverse('polls:detail', args=(past_question.id,))
    response = self.client.get(url)
    self.assertContains(response, past_question.question_text)

ERRORS:
(venv) PS C:\Users\Danil\PycharmProjects\Mysite\mysite> python manage.py test polls
Found 10 test(s).
Creating test database for alias ‘default’…
System check identified no issues (0 silenced).
EEEE.EE…

ERROR: test_future_question (polls.tests.QuestionDetailViewTests)
The detail view of a question with a pub_date in the future

Traceback (most recent call last):
File “C:\Users\Danil\PycharmProjects\Mysite\mysite\polls\tests.py”, line 112, in test_future_question
future_question = create_question(question_text=‘Future question.’, days=5)
NameError: name ‘create_question’ is not defined

======================================================================
ERROR: test_past_question (polls.tests.QuestionDetailViewTests)
The detail view of a question with a pub_date in the past

Traceback (most recent call last):
File “C:\Users\Danil\PycharmProjects\Mysite\mysite\polls\tests.py”, line 122, in test_past_question
past_question = create_question(question_text=‘Past Question.’, days=-5)
NameError: name ‘create_question’ is not defined

======================================================================
ERROR: test_future_question (polls.tests.QuestionIndexViewTests)
Questions with a pub_date in the future aren’t displayed on

Traceback (most recent call last):
File “C:\Users\Danil\PycharmProjects\Mysite\mysite\polls\tests.py”, line 75, in test_future_question
create_question(question_text=“Future question.”, days=30)
NameError: name ‘create_question’ is not defined

======================================================================
ERROR: test_future_question_and_past_question (polls.tests.QuestionIndexViewTests)
Even if both past and future questions exist, only past questions

Traceback (most recent call last):
File “C:\Users\Danil\PycharmProjects\Mysite\mysite\polls\tests.py”, line 85, in test_future_question_and_past_question
question = create_question(question_text=“Past question.”, days=-30)
NameError: name ‘create_question’ is not defined

======================================================================
ERROR: test_past_question (polls.tests.QuestionIndexViewTests)
Questions with a pub_date in the past are displayed on the

Traceback (most recent call last):
File “C:\Users\Danil\PycharmProjects\Mysite\mysite\polls\tests.py”, line 63, in test_past_question
question = create_question(question_text=“Past question.”, days=-30)
NameError: name ‘create_question’ is not defined

======================================================================
ERROR: test_two_past_questions (polls.tests.QuestionIndexViewTests)
The questions index page may display multiple questions.

Traceback (most recent call last):
File “C:\Users\Danil\PycharmProjects\Mysite\mysite\polls\tests.py”, line 97, in test_two_past_questions
question1 = create_question(question_text=“Past question 1.”, days=-30)
NameError: name ‘create_question’ is not defined


Ran 10 tests in 0.026s

FAILED (errors=6)
Destroying test database for alias ‘default’…
(venv) PS C:\Users\Danil\PycharmProjects\Mysite\mysite>

First a side note - when posting code, templates, error message, etc, here enclose each block of text between lines of three backtick - ` characters. This means you’ll have a line of ```, then your code, then another line of ```. This forces the forum software to keep the text properly formatted, which is critical with Python.

Regardless of the above, it looks like you have your create_question function as a method in a class, but that’s not what’s shown in the tutorial. That create_question function should be at the “module” level and not within a class.

Then how to make this function at the “module” level?

You “de-indent” it. The def statement starts in column 1, and the code in that function is indented beneath it as appropriate. Examine the code in the tutorial carefully, paying close attention to the indentation.

I understood everything, thanks.