2016-10-12 5 views
0

Djangoでテストするのに問題があります。私はof the responsesというドキュメントを読んできましたが、ドキュメントで説明しているのと同じことはできません。間違った動作Djangoのテストをしています

私は応答を取得すると、私は唯一のresponse.status_codeへのアクセス権を持っていると私はresponse.(and now PyCharm shows all available options)を書くときcontextまたはredirect_chainにアクセスすることはできません。

私はsettings.pyをチェックしました。私は'BACKEND': 'django.template.backends.django.DjangoTemplates'を使って、私がDjangoテンプレートを使用していることを確認しました。なぜ、テストがうまくいかないのかわかりません。私は何か設定する必要がありますか?

私はそれをやろうとしているテストのコードは次のとおりです。

from django.test import TestCase 
from django.test.client import Client 


class Test(TestCase): 
    def testLogin(self): 
     client = Client() 
     headers = {'X-OpenAM-Username': 'user', 'X-OpenAM-Password': 'password', 'Content-Type': 'application/json'} 
     data = {} 
     response = self.client.post('/login/', headers=headers, data=data, secure=True, follow=True) 
     assert (response.status_code == 200) 
     # self.assertRedirects(response, '/menu/', status_code=301, target_status_code=200) 

私はDjangoの認証を使用していないが、ログインフォームがIDPにデータを送信し、IDPは、正しい答えを送信した場合、「ログイン」それは成功だ:

def login(request): 
    logout(request) 
    message = None 
    if request.method == "POST": 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = request.POST['username'] 
      password = request.POST['password'] 
      headers = {'X-OpenAM-Username': username, 'X-OpenAM-Password': password, 'Content-Type': 'application/json'} 
      data = {} 
      req = requests.post('http://openam.idp.com:8090/openamIDP/json/authenticate', headers=headers, params=data) 
      if req.status_code == 200: 
        respJson = json.loads(req.content) 
        tokenIdJson = respJson['tokenId'] 
        request.session['tokenId'] = tokenIdJson 
        return render_to_response('menu/menu.html', request) 
      elif req.status_code == 401: 
       message = "Invalid username and/or password. Please, try again" 
    else: 
     form = LoginForm() 
    return render_to_response('registration/login.html', {'message': message, 'form': form}, 
          context_instance=RequestContext(request)) 

リダイレクトは、私は、デバッグを行うとき、私は空のredirect_chainを参照し、今では失敗したので、それはコメントしています主張しています。 Webをすべて動かすと、すべてのビューが期待どおりにリダイレクトされるため、なぜこのようなことが起こるのか理解できません。

なぜ私はstatus_codeのみチェックできますか?正常にログインした後にリダイレクトすると、通常の使用では動作しますが、テストでは何も間違っていますか?

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

答えて

1

リモート認証urlは、資格情報がヘッダーであると想定していますが、ローカルのログインビューでは、POSTというデータが必要です。テストでは、資格情報がヘッダーとしてローカルビューに渡されます。

結果として、フォームは空の辞書(実際のデータを含まないrequest.POST)に渡され、フォームは無効です。あなたはリダイレクトなしで応答として空のフォームを取得します。

あなたは、単にあなたのローカルビューにPOSTデータとして資格情報を渡す必要があります:

def testLogin(self): 
    client = Client() 
    data = {'username': 'user', 'password': 'password'} 
    response = self.client.post('/login/', data=data, secure=True, follow=True) 
    assert (response.status_code == 200) 
    self.assertRedirects(response, '/menu/', status_code=301, target_status_code=200) 
+0

こんにちは、あなたの答えのためではなく、後のおかげで、私はまだ空「redirect_chain」を取得していPOSTデータとして資格情報を渡すと、 "AssertionError:応答が期待どおりにリダイレクトされませんでした:レスポンスコードが200(予想された301)" – Aker666

+0

@ Aker666もっと見ると、あなたはリダイレクトさえ使用していません。フォームが有効で、ユーザーが正常に認証されたとしても、['redirect'](https://docs.djangoproject.com/ja/1.10/topics/http/shortcuts)ではなく、' render_to_response'を使って応答を返します。 /#リダイレクト)、または直接 'HttpResponseRedirect'を返します。 – knbk

+0

ああ、私はジャンゴを学んでいて、気付かなかった。今、それは動作します、ありがとう! – Aker666

関連する問題