2016-10-12 1 views
0

У меня проблемы с тестированием на Django. Я читал документацию of the responses, и я не могу сделать то же самое, что они объясняют в документации.Неверное поведение, выполняющее тесты на Django

Когда я получаю ответ, я только иметь доступ к response.status_code и не может получить доступ к context или redirect_chain, когда я пишу response.(and now PyCharm shows all available options).

Я проверил на 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 посылает с правильным ответом , то «Логин» это успешно:

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. Я не понимаю, почему это происходит, потому что работа в Интернете все работает, все представления перенаправляются, как ожидалось.

Почему я могу проверить только status_code? Я делаю что-то неправильно, когда я перенаправляю после успешного входа в систему, который при обычном использовании работает, но на тест нет?

Спасибо.

ответ

1

Удаленный идентификатор аутентификации ожидает, что учетные данные будут отображаться как заголовки, но ваш локальный вид входа ожидает их как POST данных. Ваш тест передает учетные данные в виде заголовков на ваш локальный вид.

В результате форма передается пустым словарем (request.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» и «AssertionError: Response не перенаправлялся, как ожидалось: код ответа был 200 (ожидается 301)» – Aker666

+0

@ Aker666 При более близком рассмотрении вы даже не используете перенаправление. Даже если форма действительна и пользователь успешно прошел аутентификацию, вы возвращаете ответ с помощью 'render_to_response', вместо того, чтобы использовать [' redirect'] (https://docs.djangoproject.com/en/1.10/topics/http/shortcuts/# переадресация) или напрямую возвращать 'HttpResponseRedirect'. – knbk

+0

О, я изучаю Джанго и этого не замечал. Теперь это работает, спасибо! – Aker666

Смежные вопросы