我正在使用Django Rest框架編寫的UserDetail視圖上運行測試。Django Rest Framework測試失敗:使用URL關鍵字參數調用期望視圖
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', '[email protected]', 'johnpassword')
self.client.login(username='john', password='johnpassword')
self.user1 = User.objects.create(username="user1", password="pass", email="[email protected]")
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參數看法?
UPDATE:
現在用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'
其中經理是我的自定義用戶模型的屬性。我猜想客戶端身份驗證存在一些問題。我已啓用會話身份驗證。仍然收到此錯誤。
更新:我的登錄名不適用於APICLient,因爲我創建的用戶使用的是User.objects.create
而不是User.objects.create_user
。改變這個問題就解決了問題:)
我在reverse()中收到錯誤。我正在使用reverse('users:user-detail')。我得到錯誤:字典更新序列元素#0的長度爲1; 2是必需的 – Ajax
我通過將URL添加到user_id來修復該部分。現在我得到了身份驗證錯誤,即使在使用客戶端和身份驗證憑據後,AttributeError:'AnonymousUser'對象也沒有屬性'is_manager',我的測試已啓用會話身份驗證。 – Ajax
我認爲我沒有足夠的信息來診斷 - 但是關於auth的說法 - 請記住,DRF的認證系統完全獨立於Django - 而Django前端可能使用會話認證進行認證,您幾乎可以確定在API上使用basic/token/oauth,並且可能不會驗證DRF的正確方式 - 我使用後一個auth頭進行測試以消除任何歧義。 – Steve