Django 测试 DoesNotExist

Django test DoesNotExist

我正在尝试在视图中测试撤销功能:

@login_required
def revoke(request, id):
    """
    Delete access token
    """
    obj = Hiren.objects.get(pk=id)
    obj.delete()
    return redirect('/hiren')

这是我抛出错误的测试代码:

class TestRevokeView(TestCase):

    def setUp(self):
        User.objects.create_superuser(
            username='admin', password='admin', email='admin@admin.lol')
        item = Hiren()
        item.access_token = "bla bla"
        item.authorized = True
        item.save()

    def test_logged_in_user_can_delete_object(self):
        self.client.login(username='admin', password='admin')
        count = Hiren.objects.all().count()
        self.assertEqual(count, 1)
        response = self.client.get('/revoke/1/', follow=True)
        self.assertRedirects(response, '/hiren/')

错误代码如下:

Traceback (most recent call last):
  File ".....tests.py", line 109, in test_logged_in_user_can_delete_object
    response = self.client.get('/revoke/1/', follow=True)
 ....................
  self.model._meta.object_name
github.models.DoesNotExist: Hiren matching query does not exist.

所以我的问题是我在这里缺少什么。

您需要确保您在 setUp 方法上创建的 Hiren 实例具有 ID 等于 1

为避免这种情况,将 Hiren id 实例设置为 class 变量,然后在您的测试方法中使用它。

class TestRevokeView(TestCase):

    def setUp(self):
        User.objects.create_superuser(
            username='admin', password='admin', email='admin@admin.lol')
        item = Hiren()
        item.access_token = "bla bla"
        item.authorized = True
        item.save()
        self.HIREN_ID = item.id

    def test_logged_in_user_can_delete_object(self):
        self.client.login(username='admin', password='admin')
        count = Hiren.objects.all().count()
        self.assertEqual(count, 1)
        response = self.client.get('/revoke/%s/' % self.HIREN_ID), follow=True)
        self.assertRedirects(response, '/hiren/')

可能 Hiren 项的 pk 不是 1.

class TestRevokeView(TestCase):

    def setUp(self):
        User.objects.create_superuser(
            username='admin', password='admin', email='admin@admin.lol')
        self.item = Hiren()
        self.item.access_token = "bla bla"
        self.item.authorized = True
        self.item.save()

    def test_logged_in_user_can_delete_object(self):
        self.client.login(username='admin', password='admin')
        count = Hiren.objects.all().count()
        self.assertEqual(count, 1)
        response = self.client.get('/revoke/{0}/'.format(self.item.pk), follow=True)
        self.assertRedirects(response, '/hiren/')