2016-04-21 30 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 ") 

- 私はメッセージが追加されているかどうかをテストする必要があります。この時点で私は私のために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'文字列を返します。私は決してこれをやったことはありませんが、あなたがそれを行う限り、テストするためにどのような方法でも動作するはずです(カール、wget、Pythonの何か...)。 –

答えて

0

私の意見では問題ではない。あなたはテスト前の多くの開発者、テスト後の多くの開発者を見つけるでしょう。好きな順序で実装してください。時には急いで最初にテストをせずに作業プロトタイプを書く方が簡単です(特にインターフェイスがファイナライズされておらず、開発中に変更が多い場合は、毎回多くのテストを調整することで時間を無駄にすることはありませんいくつかのインターフェイスを変更する必要があります)。完成したインターフェースを既に持っているときは、少なくともテストを書くのは怠惰ではない。

本当に重要なのは、明確に定義されたインターフェイスを持つことです。バックエンドの観点からは、インターフェース実装(この場合はビュー)とインターフェースのユーザーを1人または複数持ちます:フロントエンドとテストの両方がバックエンド実装のユーザーですが、さらに多くのユーザーがいる可能性があります。インターフェイスを取った後、最初に実装するものは本当に問題になりません。インタフェースの一方の側面を嘲笑することで、嘲笑された面の元のバージョンを持たずに相手側を実装することができます。たとえば、JavaScript応答コードを使用してサーバレスポンスを模擬/偽装することで、バックエンドコードなしでフロントエンドだけを書くことができます。バックエンドを最初に書くことも、バックエンドのテストを書くこともできます。

特殊な開発者(フロントエンド/バックエンド)を持つチームでは、インターフェイスに同意し、フロントエンドとバックエンドの両方で同意することができます。フロントエンドの人いくつかの偽のデータでサーバレスポンスをエミュレートするコードを記述し、バックエンドの人はいくつかのテストを書き、いくつかの偽のリクエストでクライアントをエミュレートします。このようにして、フロントエンドとバックエンドのチームはコードを完成させるのを待たずに、フロントエンドとバックエンドの両方をテストできるだけです。もちろん、接続されたスタック全体をテストするend-to-end(e2e)テストを追加することをお勧めします。

また、実際に最も重要なのは、通常、インターフェイスの周りに書かれたコードではなく、明確に定義されたインターフェイスを持つことです。だんだんとしたシステムでは、問題は通常、インターフェースなしのコードしかありません。システムが構造的にうまく構築され、インターフェースがうまく定義されていれば、インターフェースの周りに書かれた非常にたくさんのコードが扱いやすくなります。

よく定義されたインターフェースを持つジャンゴビューの場合、私は通常テストと一緒にバックエンドを開発します。あなたのケースでは、djangoテストは非常に簡単です:あなたはちょうどdjangoテストクライアント(https://docs.djangoproject.com/en/1.8/topics/testing/tools/#test-client)を作成し、それをクライアントにシミュレートするためにいくつかの偽のリクエストを送信し、その結果dbに結果として期待されるオブジェクトが含まれているかどうかをチェックします。

いくつかの追加のアドバイス:

  • は、私はあなたがクライアントへの応答拒否するrequest.is_ajax()を使用してはならないと思います@require_POST
  • であなたのビューを飾ります。request.is_ajax()は、通常、クライアントがどのような種類の応答を必要としているかを調べるために使用されます。 POSTリクエストがHTMLページのフォームによって送信された場合、別のhtmlページをレスポンスとして生成する必要があります。リクエストがajaxを使用して送信された場合、通常はhtmlの代わりに処理可能なデータ(json、xmlなど)で応答します。
0

あなたのメソッドは、クライアントからの要求を持っていなければならず、HttpResponse(全体的に)を提供しているので、フロントエンドからのAJAXクエリでしかチェックできません。 ChatMessageの作成にはsession_keyが含まれているため、リクエストが最初に行われたときにしか見つからないため、AJAXクエリーを作成することをお勧めします。

関連する問題