2013-02-05 10 views
6

私はログインビューを作成しており、ビューのユニットテストを追加したいと考えています。私の見解は次のようになります。Djangoユニットテストでセッションオブジェクトを使用する

def login(request): 

    if request.POST: 
      usrname = request.POST.get('username') 
      password = request.POST.get('password') 
      user = authenticate(username=usrname, password=password) 

      if user is not None: 
        auth_login(request, user) 
        return redirect('/core/home/') 
      else: 
        context = {'error_message': "Invalid username or password"} 
        return render(request, 'core/login.html', context) 
    else: 
      c = {} 
      c.update(csrf(request)) 
      return render_to_response('core/login.html',c) 

def home(request): 
    if request.user.is_authenticated(): 
     context = {'user' : request.user} 
     return render(request, 'core/home.html', context) 
    else: 
     return render(request, 'core/login.html') 

そして、私のユニットテストは、次のようになります。彼らはセッションオブジェクトを見つけることができないので、

class CoreViewTests(TestCase): 
    def setUp(self): 
      self.factory = RequestFactory() 

    def test_login_view_with_valid_user(self): 
      uf = UserFactory() 
      user = uf.make_user("ValidUser1", "12345", "[email protected]") 
      self.assertEqual(user.username, "ValidUser1") 
      request = self.factory.post('/core/login', {"username": "ValidUser1", "password": "12345"}) 
      response = login(request) 
      self.assertEqual(response.status_code, 200) 

ユニットテストのクラッシュ。ダミーセッション辞書を定義してウェブサイト上のカップルチュートリアルに従いますが、それは役に立ちません。

セッションオブジェクトを処理する必要があるビューのユニットテストを書く方法を教えてください。

ありがとうございました。

+0

これはあなたの正確なコードですか? 'request = self.factory.post( '/ core/login'、{" username ":" ValidUser1 "、" password ":" 12345 ")'この行には閉じられていない辞書があります。 .com.post( '/ core/login'、{"username": "ValidUser1"、 "password": "12345"、}) ' –

+0

はい、私はレポから自分のコードをコピーします。おそらく私はチェックイン時にタイプミスがありました。 –

+0

あなたはまだコードを修正してエラーが出ますか? –

答えて

7

RequestFactoryオブジェクトのドキュメントから:

これは、ミドルウェアをサポートしていません。ビューが正しく機能するためには、セッションおよび認証属性がテスト自体によって提供されている必要があります。

request.sessionを手動で適切なものを含む辞書に設定することもできます。しかし、旧式のDjango test clientを使用する方が簡単になるかもしれません。

+0

[模擬](https://pypi.python.org/pypi/mock)ライブラリを使用してください。 –

関連する問題