Django request.user модификации не происходит в тесте - PullRequest
1 голос
/ 29 марта 2020

У меня есть вид, который изменяет поле request.user:

def test(request):                  
    request.user.is_provider = False
    request.user.save()
    print(request.user.is_provider)
    return HttpResponse(status=200)

Теперь я тестирую функцию, и у меня есть следующий тест:

class RoleSwitchTests(TestCase):
    def test_switch_to_customer(self):
        User = get_user_model()
        user = User.objects.create_user(
            username='test',
            email='test',
            password='test',
            first_name='test',
            last_name='test',
            is_provider=True,
            is_admin=False,
        )
        self.client.login(username='test', password='test')
        response = self.client.post('/test/', follow=True)
        print(user.is_provider)
        self.assertEqual(response.status_code, 200)
        self.assertFalse(user.is_provider)

self.assertFalse(user.is_provider) терпит неудачу здесь. По какой-то причине request.user.is_provider равно False в test, но в test_switch_to_customer, user.is_provider равно True. Я знаю, что они относятся к одному и тому же пользователю, потому что имеют одинаковый id, так почему же здесь не сохраняется модификация?

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Вы должны использовать refresh_from_db , чтобы перезагрузить обновленного пользователя из базы данных после публикации

user.refresh_from_db()
0 голосов
/ 29 марта 2020

Представление и тест работают с разными User объектами, которые имеют одинаковый первичный ключ. Следовательно, изменения, сделанные представлением, не выполняются в тесте user.

Вы можете повторно получить объект User, например, с помощью:

class RoleSwitchTests(TestCase):
    def test_switch_to_customer(self):
        User = get_user_model()
        user = User.objects.create_user(
            username='test',
            email='test',
            password='test',
            first_name='test',
            last_name='test',
            is_provider=True,
            is_admin=False,
        )
        self.client.login(username='test', password='test')
        response = self.client.post('/test/', follow=True)
        <b>user = User.objects.get(pk=user.pk)</b>  # fetch from database
        print(user.is_provider)
        self.assertEqual(response.status_code, 200)
        self.assertFalse(user.is_provider)
...