Тестовая база данных пуста при запросе внутри представления - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть сценарий, в котором я проверяю данные регистрационной формы посетителя (через подкласс UserCreationForm).

Если не существует ни одного пользователя с именем пользователя, которое предоставляет посетитель, создается новый User. В противном случае условия проверяются, и посетитель получает сообщение fla sh (ie. f"Username {username} exists. Choose another username."

. После создания TestCase я создал существующий User с использованием User.objects.create_user(). При тестировании представления QuerySet пуст при выполнении запроса User.objects.get(). В результате возникает User.DoesNotExist, что не является желаемым результатом. Скорее, желаемый результат - переходить в предложение else .

Почему тестовая база данных будет пустой из User экземпляров при тестировании представления при его заполнении в setUpTestData?

test_views.py

class TestCreateNewChef_Case2(TestCase):

    def setUpTestData(cls):
        User.objects.create_user(
            username='masterchef',
            password='password',

        )
        cls.user_signup_data = {
            'username': 'masterchef',
            'password1': 'secret',
            'password2': 'secret'
        }

        print(User.objects.all()) # <QuerySet [<User: masterchef>]>

    def test_new_chef_sign_up_username_taken(self):
        response = self.client.post(
            reverse("chef:register"), 
            self.user_signup_data,
            follow=True

        )
        self.assertRedirects(response, reverse("chef:register"))
        self.assertTemplateUsed('chef/register_chef.html')
        self.assertContains(
            response,
            "<p>Username masterchef exists. Choose another username.</p>",
            html=True
        )

views.py

def register_chef(request):
    if request.method == 'POST':
        new_user_form = ChefRegisterationForm(request.POST)
        if new_user_form.is_valid():
            try:
                user = User.objects.get(
                    username=new_user_form.cleaned_data['username']
                )
                stored_password = check_password(
                    new_user_form.cleaned_data['check_password'], 
                    user.password
                )
            except User.DoesNotExist:
                # if no Users exist with the username, create a new user
            else:
                # conditionally check existing users with the submitted username

(Pdb) User.objects.all()
<QuerySet []>
(Pdb) n
>(17)register_chef()
-> user = User.objects.get(
(Pdb) n
> (18)register_chef()
-> username=new_user_form.cleaned_data['username']
(Pdb) n
django.contrib.auth.models.DoesNotExist: User matching query does not exist.

1 Ответ

0 голосов
/ 04 февраля 2020

Вы должны использовать setUpTestData с classmethod декоратором:

@classmethod
def setUpTestData(cls):
    User.objects.create_user(
        username='masterchef',
        password='password',

    )
    cls.user_signup_data = {
        'username': 'masterchef',
        'password1': 'secret',
        'password2': 'secret'
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...