2016-08-15 16 views
0

DjangoのRequestFactoryを使用して簡単なテストを行いました。私の見解では、自分自身でテストしたい状態をいくつか設定しています(これは素晴らしい例ではありませんが、要求が処理された後でビューのいくつかの状態を正当な理由でHTMLから解析するのではなく、 ):私は、要求を処理するために使用されるビューのインスタンスを取得する方法を見ることができない内部を見てみるとDjangoの "as_view"メカニズムからCBVインスタンスを取得するためのより良い方法があります

def some_test(self): 
    rf = RequestFactory() 
    get_request = rf.get('/foo/') 
    view = MyView.as_view() 
    response = view(
     get_request, 
     foo="hello", 
     bar="world" 
    ) 
    self.assertEquals(??.sentence_to_display, "hello world") 

??getセットself.sentence_to_display

で最高のビューインスタンスのための私のプレースホルダです私はCBVでdispatchを無効にしています:

def dispatch(self, request, *args, **kwargs): 
    request.META["__the_view__"] = self 
    return super(MyView, self).dispatch(request, *args, **kwargs) 

はその後のような私のテストを変更:

def some_test(self): 
    rf = RequestFactory() 
    get_request = rf.get('/foo/') 
    view = MyView.as_view() 
    response = view(
     get_request, 
     foo="hello", 
     bar="world" 
    ) 
    self.assertEquals(get_request['__the_view__'].sentence_to_display, "hello world") 

私の例は、任意であるが、私のCBVは、テンプレートを経由してHTMLをレンダリングする前に、物事の多くを計算する方法がたくさんあります。私はDjangoがテンプレートをレンダリングすると信じています。私はそのようなテンプレートをテストしたくないので、呼び出された後にCBVメソッドとインスタンスの状態をテストしたいと思います。

私が実際に使っているのは、というメソッドを単体テストしてレスポンスをビルドしたいときに、BeautifulSoupを使って膨大な量の出力を掘り起こしたくないということです。

もっと良いアプローチはありますか?私はポイントを逃していますか?

多くのありがとうございます。

ジャンゴ1.6は、残念ながら

答えて

0

View.as_view()インスタンスを作成しません。それが行うのは、ビューが呼び出されたときにインスタンスを作成するクロージャー関数を返すことだけです。

できることは、手動でインスタンスを作成し、クロージャー関数と同じ方法で準備することです。

def some_test(self): 
    rf = RequestFactory() 
    get_request = rf.get('/foo/') 
    view = MyView() 
    if hasattr(view , 'get') and not hasattr(view, 'head'): 
     view.head = view.get 
    view.request = request 
    view.args =() 
    view.kwargs = {'foo': 'hello', 'bar': 'world'} 
    response = view.dispatch(get_request, *view.args, **view.kwargs) 
    self.assertEquals(view.sentence_to_display, "hello world") 

あなたはDjangoがここにビューをインスタンス化するために使用する正確なコードを見ることができます:https://github.com/django/django/blob/stable/1.6.x/django/views/generic/base.py#L62

+0

うん、私はメカニックを理解しています。 as_view()によって返された内部関数を再実装するために過剰な使い方があると感じますが、テストの場合はおそらくテスト対象のビューをクリーンに保ちます。提案していただきありがとうございます。 –

関連する問題