2016-04-21 106 views
0

通過Django開發一個簡單的聊天系統 - 我已經實現了一些發送/接收消息的方法。測試django方法

例如(這不是我的實現,但只是一個例子一個從另一個聊天應用程序):

def post(request): 
    time.sleep(2) 
    if not request.is_ajax(): 
    HttpResponse (" Not an AJAX request ") 
    if request.method == 'POST': 
    if request.POST['message']: 
     message = request.POST['message'] 
     to_user = request.POST['to_user'] 
     ChatMessage.objects.create(sender = request.user, receiver = User.objects.get(username = to_user), message = message, session = Session.objects.get(session_key = request.session.session_key)) 

return HttpResponse (" Not an POST request ") 

現在,我有方法寫入 - 我需要測試,看看是否被添加消息。在這一點上,我沒有爲I.e編寫任何JavaScript。間隔刷新和等待消息等。我應該直接寫入JS或先測試這個方法,看看它是否能正常工作,然後爲它寫JS?聽起來像一個愚蠢的問題,但我發現很難理解我將如何去測試方法...

+0

根據[documentation](https://docs.djangoproject.com/en/1.9/ref/request-response/#django.http.HttpRequest.is_ajax),您需要設置HTTP_X_REQUESTED_WITH標頭'XMLHttpRequest'字符串,當你寫你自己的電話。我從來沒有這樣做,但只要你這樣做,它應該用你可能用來測試的任何方法(curl,wget,Python中的東西...)。 –

回答

0

在我看來,這並不重要。你會發現很多開發人員都在測試之前,而且很多人都在測試之後。以您喜歡的任何順序實施它。有些時候,如果在沒有任何測試的情況下編寫一個工作原型比較容易(尤其是在接口沒有完成並且在開發過程中仍然會發生很大變化的情況下),在這種情況下,您不必每次都通過調整大量測試來浪費時間你必須改變一些接口。)。至少當你已經有最終的接口時,不要懶惰地寫測試。

真正重要的是要有良好定義的接口。從後端角度來看,您將有一個接口實現(本例中爲視圖)和一個或多個接口用戶:前端和測試都是後端實現的用戶,但可能還有更多。擁有界面之後,你首先實現哪一個並不重要。通過嘲笑界面的一面,您可以實現另一面,而不需要原始版本的模擬面。例如,通過使用javascript代碼嘲笑/僞造服務器響應(使用預先可能的常量數據),您只能編寫一個沒有任何後端代碼的前端。你也可以先寫後端,或者後端測試......你決定。 (前端/後端)你可以在接口上達成一致,然後在前端和後端都可以「模擬」(假)接口的另一端:前端球員編寫一些模擬服務器響應的代碼,使用一些僞造的數據,而後端人員編寫一些測試,用一些假的請求來模擬客戶端。通過這種方式,前端和後端團隊不必等待對方完成代碼,前端和後端都可以單獨測試。當然,以後建議添加端到端(e2e)測試來測試連接在一起的整個堆棧。

再一次,真正最重要的是通常具有定義良好的接口,而不是圍繞接口編寫的代碼。在蹩腳的系統中,問題通常是你只有沒有接口的代碼......如果一個系統在架構上構建良好,接口定義良好,那麼在接口上編寫的很多糟糕的代碼是可以管理的。

如果django視圖具有良好定義的界面,我通常會首先與測試一起開發後端。在你的情況下,django測試是非常簡單的:你只需創建一個django測試客戶端(https://docs.djangoproject.com/en/1.8/topics/testing/tools/#test-client),發佈一些虛假的請求來模擬客戶端,然後檢查數據庫是否包含期望的對象。

一些額外的建議:

  • 裝飾你的觀點與@require_POST
  • 我認爲你不應該使用request.is_ajax()拒絕響應到客戶端。通常用request.is_ajax()來找出客戶端需要什麼樣的響應。如果POST請求是通過html頁面的形式發送的,那麼您希望生成另一個html頁面作爲響應。如果請求是使用ajax發送的,那麼你通常想用可處理的數據(json,xml等)來響應,而不是html。
0

由於您的方法必須有客戶端提出的請求,然後提供HttpResponse(整體),您只能通過前端的AJAX查詢來檢查。我建議構建一個快速的AJAX查詢,也是因爲,ChatMessage的創建涉及到一個session_key,它只能在首先發出請求時才能找到。