Django Rest Framework - 测试中的 AssertionError
Django Rest Framework - AssertionError in tests
我对 Django Rest Framework 的测试有疑问。我有以下看法:
class AccountDetail(generics.RetrieveUpdateAPIView):
model = Account
serializer_class = AccountSerializer
lookup_field = 'username'
permission_classes = (permissions.AllowAny,)
def get_queryset(self):
return Account.objects.filter(username=self.kwargs.get('username'))
我的网址包括以下内容:
account_urls = patterns('',
url(r'^/(?P<username>[0-9a-zA-Z_-]+)/$', AccountDetail.as_view(), name='account-detail'),
url(r'^/$', AccountList.as_view(), name='account-list')
)
urlpatterns = patterns('',
url(r'^api/v1/users', include(account_urls)),
)
当我使用可浏览的 API 时,一切正常,但是当我编写以下测试时,出现错误:
class TestAccoundDetail(APITestCase):
def setUp(self):
factory = APIRequestFactory()
#set up normal user and token
self.normal_user = Account.objects.create_user(email="user@example.com", username="useri", password="man")
request = factory.post('/api/v1/auth/login/', {'email': 'user@example.com', 'password': 'man'})
response = obtain_jwt_token(request)
self.normal_token = response.data['token']
def test_details(self):
factory = APIRequestFactory()
view = AccountDetail.as_view()
#unauthenticated
url = reverse('account-detail', kwargs={'username': 'useri'})
request = factory.get(url)
response = view(request)
self.assertEqual(response.status_code, 200)
AssertionError:应使用名为 "username" 的 URL 关键字参数调用视图 AccountDetail。修复您的 URL conf,或正确设置视图的 .lookup_field
属性。
URL 看起来不错,lookup_field 就在那里。我错过了什么?
编辑
我改用 APIClient 并且有效:
client = APIClient()
response = client.get('/api/v1/users/useri/')
self.assertEqual(response.status_code, 200)
但是,我还是不明白为什么我原来的测试没有成功。
RequestFactory 用于对视图进行单元测试。它确实绕过了中间件和 url 层。因此,您需要自己提供额外的参数,而 ClientFactory urls.py 会为您完成。
编辑:
换句话说,
response = view(request)
应该是
response = view(request, "useri")
扩展@linovias 的答案,关键是将额外的参数传递给您的视图
response = (view, username='useri')
全面测试
def test_details(self):
factory = APIRequestFactory()
view = AccountDetail.as_view()
#unauthenticated
url = reverse('account-detail', kwargs={'username': 'useri'})
request = factory.get(url)
response = view(request, username='useri')
self.assertEqual(response.status_code, 200)
我对 Django Rest Framework 的测试有疑问。我有以下看法:
class AccountDetail(generics.RetrieveUpdateAPIView):
model = Account
serializer_class = AccountSerializer
lookup_field = 'username'
permission_classes = (permissions.AllowAny,)
def get_queryset(self):
return Account.objects.filter(username=self.kwargs.get('username'))
我的网址包括以下内容:
account_urls = patterns('',
url(r'^/(?P<username>[0-9a-zA-Z_-]+)/$', AccountDetail.as_view(), name='account-detail'),
url(r'^/$', AccountList.as_view(), name='account-list')
)
urlpatterns = patterns('',
url(r'^api/v1/users', include(account_urls)),
)
当我使用可浏览的 API 时,一切正常,但是当我编写以下测试时,出现错误:
class TestAccoundDetail(APITestCase):
def setUp(self):
factory = APIRequestFactory()
#set up normal user and token
self.normal_user = Account.objects.create_user(email="user@example.com", username="useri", password="man")
request = factory.post('/api/v1/auth/login/', {'email': 'user@example.com', 'password': 'man'})
response = obtain_jwt_token(request)
self.normal_token = response.data['token']
def test_details(self):
factory = APIRequestFactory()
view = AccountDetail.as_view()
#unauthenticated
url = reverse('account-detail', kwargs={'username': 'useri'})
request = factory.get(url)
response = view(request)
self.assertEqual(response.status_code, 200)
AssertionError:应使用名为 "username" 的 URL 关键字参数调用视图 AccountDetail。修复您的 URL conf,或正确设置视图的 .lookup_field
属性。
URL 看起来不错,lookup_field 就在那里。我错过了什么?
编辑
我改用 APIClient 并且有效:
client = APIClient()
response = client.get('/api/v1/users/useri/')
self.assertEqual(response.status_code, 200)
但是,我还是不明白为什么我原来的测试没有成功。
RequestFactory 用于对视图进行单元测试。它确实绕过了中间件和 url 层。因此,您需要自己提供额外的参数,而 ClientFactory urls.py 会为您完成。
编辑: 换句话说,
response = view(request)
应该是
response = view(request, "useri")
扩展@linovias 的答案,关键是将额外的参数传递给您的视图
response = (view, username='useri')
全面测试
def test_details(self):
factory = APIRequestFactory()
view = AccountDetail.as_view()
#unauthenticated
url = reverse('account-detail', kwargs={'username': 'useri'})
request = factory.get(url)
response = view(request, username='useri')
self.assertEqual(response.status_code, 200)