Django Rest Framework测试失败:使用URL关键字参数调用预期视图

时间:2016-07-24 09:19:02

标签: django testing django-rest-framework django-testing

我在使用Django Rest框架编写的UserDetail视图上运行测试。

urls.py

    url(r'^api/users/', include('calorie_counter.users.urls', namespace='users')),

用户/ urls.py

    url(r'^(?P<pk>[0-9]+)$', views.UserDetail.as_view(), name='user-detail'),

test_api.py

BaseAPITestCase(APITestCase):
    def setUp(self):
        self.superuser = User.objects.create_superuser('admin', 'admin@test.com', 'johnpassword')
        self.client.login(username='john', password='johnpassword')
        self.user1 = User.objects.create(username="user1", password="pass", email="user1@test.com")


class ReadUserTest(BaseAPITestCase):
# check read permissions
    def test_user_can_read_self_detail(self):
        url = '/api/users/'+str(self.user1.id)
        factory = APIRequestFactory()
        request = factory.get(url)
        force_authenticate(request, self.user1)
        response = (UserDetail.as_view())(request)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

但是,运行此测试会出现以下错误。 'pk'agrument没有传递给UserDetail视图。

AssertionError: Expected view UserDetail to be called with a URL keyword argument named "pk". Fix your URL conf, or set the .lookup_field attribute on the view correctly.

如何使用URL参数测试视图?

更新:

现在使用API​​Client代替工厂..

def test_user_can_read_self_detail(self):
    client = APIClient()
    client.login(username='user1', password='pass')

    # response = self.client.get('/api/users/', {'pk': self.user.id})
    response = client.get('/api/users/' + str(self.user1.id))
    self.assertEqual(response.status_code, status.HTTP_200_OK)

现在我收到以下错误:

AttributeError: 'AnonymousUser' object has no attribute 'is_manager'

其中,manager是我的自定义用户模型的属性。我猜客户端身份验证存在一些问题。我启用了会话身份验证。仍然有这个错误。

更新:我的登录不适用于APICLient,因为我使用User.objects.create而不是User.objects.create_user创建用户。改变那个解决了问题。 :)

1 个答案:

答案 0 :(得分:3)

我认为你不需要所有这些设置,你需要自己实例化视图类 - 或许你可以利用测试获得更多成功客户端有类似的东西:

def test_user_can_read_self_detail(self):
    url = reverse('api:user-detail', kwargs={'pk': self.user.id})
    response = self.client.get(url)
    self.assertEqual(response.status_code, status.HTTP_200_OK)

如果您遇到身份验证问题,我怀疑这可能是您的最佳选择,您可能需要尝试:

self.client.login(username='example', password='changeme')

import base64
self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + base64.b64encode('example:changeme')

我过去曾使用它们来测试经过身份验证的API端点。