2016-07-24 17 views
0

我正在使用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。改變這個問題就解決了問題:)

回答

1

我不認爲你需要所有這些設置,你在做什麼,這是不尋常的需要實例化自己的視圖類 - 也許你就會有更多的成功撬動測試客戶端的東西,如:

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端點。

+0

我在reverse()中收到錯誤。我正在使用reverse('users:user-detail')。我得到錯誤:字典更新序列元素#0的長度爲1; 2是必需的 – Ajax

+0

我通過將URL添加到user_id來修復該部分。現在我得到了身份驗證錯誤,即使在使用客戶端和身份驗證憑據後,AttributeError:'AnonymousUser'對象也沒有屬性'is_manager',我的測試已啓用會話身份驗證。 – Ajax

+0

我認爲我沒有足夠的信息來診斷 - 但是關於auth的說法 - 請記住,DRF的認證系統完全獨立於Django - 而Django前端可能使用會話認證進行認證,您幾乎可以確定在API上使用basic/token/oauth,並且可能不會驗證DRF的正確方式 - 我使用後一個auth頭進行測試以消除任何歧義。 – Steve

相關問題