2016-04-20 55 views
0

我爲寫一個Django REST視圖的APITestCase有一個奇怪的錯誤。Django REST測試忽略了工廠的網址

這是我的代碼:

class CreateUserTest(APITestCase): 
    def setup(self): 
     self.superuser = User.objects.create_superuser('[email protected]', '1989-10-06', 'vishnupassword') 
     self.client.login(username='vishnu', password='vishnupassword') 
     self.data = a bunch of trivial data 

    def test_can_create_user(self): 
     print "create user" 
     self.setup() 
     self.token = Token.objects.get(user_id=self.superuser.id) 
     self.api_key = settings.API_KEY 
     self.factory = APIRequestFactory() 
     self.request = self.factory.post('/api/v1/uaaaaaasers/?api_key=%s' % self.api_key, 
            self.data, 
            HTTP_AUTHORIZATION='Token {}'.format(self.token)) 
     force_authenticate(self.request, user=self.superuser) 
     self.view = UserList.as_view() 
     self.response = self.view(self.request) 
     self.response.render() 
     #print self.response.content 
     self.assertEqual(self.response.status_code, status.HTTP_201_CREATED) 

正如你看到我運行一個factory.post以故意錯誤的URL/API/V1/uaaaaaasers/

但測試犯規抱怨:

Creating test database for alias 'default'... 
create user . 
---------------------------------------------------------------------- 

Ran 1 test in 0.199s 

OK Destroying test database for alias 'default'... 

不應該與該錯誤的網址崩潰?我怎麼知道測試進行得很好?

回答

1

你正在測試它,你已經測試了所有的錯...... 的反應是從直接查看通話...

self.view = UserList.as_view() 
self.response = self.view(self.request) 
self.response.render() 
    #print self.response.content 
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED) 

上面你的情況總是會調用視圖...

在實際的測試案例,我們打與客戶端的URL和測試響應

self.response = self.client.post('/api/v1/uaaaaaasers/?api_key=%s' % self.api_key, 
           self.data, 
           HTTP_AUTHORIZATION='Token {}'.format(self.token)) 
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED) 
+0

你在哪裏得到你的例子中的self.response? – lapinkoira

+0

@lapinkoira更新上面:)...在上面的代碼中的問題只是,Django沒有映射到視圖的URL ...你手動調用視圖:) –

1

如果要測試將請求發佈到無效url,請使用test client而不是請求工廠。

class CreateUserTest(APITestCase): 

    def test_can_create_user(self): 
     ... 
     response = self.client.post(
      '/api/v1/uaaaaaasers/?api_key=%s' % self.api_key, 
      self.data, 
      ... 
     ) 
     ... 
+0

嗯,我confu sed在這裏,我怎麼知道我沒有在我所有的測試中拼錯我的網址?不能依靠請求工廠?或者如何在Django休息中測試api視圖的最佳實踐? – lapinkoira

+1

如果您使用請求工廠,則正在測試視圖。你沒有測試你的url模式配置了正確的視圖。使用測試客戶端模擬對特定url的請求,所以*正在測試你的url配置。請求工廠爲您提供了更多的控制權,但很多時候這不是必需的,而且使用測試客戶端更容易。 – Alasdair