Django Rest Framework 测试失败:使用 URL 关键字参数调用预期视图
Django Rest Framework test fails: Expected view to be called with a URL keyword argument
我正在 运行 测试使用 Django Rest 框架编写的 UserDetail 视图。
urls.py
url(r'^api/users/', include('calorie_counter.users.urls', namespace='users')),
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' 参数未传递到 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 参数测试视图?
更新:
现在使用 APIClient 而不是工厂..
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
创建用户。改变它解决了问题。 :)
我不认为你需要你正在做的所有这些设置,需要自己实例化视图 类 是不常见的——也许你会更成功地利用测试客户端,比如:
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 端点。
我正在 运行 测试使用 Django Rest 框架编写的 UserDetail 视图。
urls.py
url(r'^api/users/', include('calorie_counter.users.urls', namespace='users')),
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' 参数未传递到 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 参数测试视图?
更新:
现在使用 APIClient 而不是工厂..
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
创建用户。改变它解决了问题。 :)
我不认为你需要你正在做的所有这些设置,需要自己实例化视图 类 是不常见的——也许你会更成功地利用测试客户端,比如:
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 端点。