2017-10-30 23 views
1

次のコードでは間違った結果が得られます:nose.proxy.AssertionError:302!= 200:リダイレクトページ '/ mes_dossiers /'を取得できませんでした:Djangoがリダイレクトをアサートする方法をテストしています

私のコードに間違いがありますか?

#test.py 
from django.test import TestCase, RequestFactory, Client 
from ..models import * 
from ..views import * 
from django.core.management import call_command 

class Cas(TestCase): 

    def setUp(self): 
     call_command('loaddata', 'fixture_users.json', verbosity=1) 
     call_command('loaddata', 'xxxxx_tests_xxxx.yaml', 
     verbosity=1) 

    def test_dossier_duplicate(self) : 
     request = self.factory.get('/dossier/3/copier/', follow = True) 
     request.user = User.objects.get(id=3) 
     pk = 3 
     response = dossier_duplicate(request, pk) 
     response.client = Client() 
     self.assertRedirects(response,'/mes_dossiers/',status_code=302, 
     target_status_code=200) 

#urls.py 
urlpatterns = [  
url(r'^dossier/(?P<pk>[0-9]+)/copier/$',views.dossier_duplicate), 

] 

#views.py 
@login_required(login_url="/accounts/login/") 
def dossier_duplicate(request, pk): 

    dossier = get_object_or_404(Dossier, pk=pk) 
    groupe = dossier.createdBy.groups.all()[0].name 

    if not in_group(request.user, groupe) : 
     return HttpResponseForbidden('Vous ne pouvez pas accéder à ce 
     dossier') 

    else : 

     #code to duplicate the "dossier" instance and child contents 
     # 
     # 

     return redirect('/mes_dossiers/') 
+1

をテストしているコードは何ですか?また、質問のタイトルは、質問の内容とは関係がないようです。 –

+0

タイトルが編集されました。ご迷惑をおかけしました。 –

+0

'/ mes_dossiers /'のビューも別のURLにリダイレクトされることはありますか? –

答えて

0

self.client.getに、より多くの例を変更してみてください:

Django : Testing if the page has redirected to the desired url

https://docs.djangoproject.com/en/1.7/topics/testing/tools/#django.test.SimpleTestCase.assertRedirects

、これが働いた:

class Cas(TestCase): 

    def setUp(self): 
     call_command('loaddata', 'fixture_users.json', verbosity=1) 
     call_command('loaddata', 'xxx_tests_xxxx.yaml', 
     verbosity=1) 

    def test_dossier_duplicate(self) : 
     request = self.client.get('/dossier/3/copier/', follow = True) 
     request.user = User.objects.get(id=3) 
     pk = 3 
     response = dossier_duplicate(request, pk) 
     response.client = Client() 
     response.client.login(username='xxxx', password='xxxxx') 

     self.assertRedirects(response, '/mes_dossiers/', status_code=302, 
     target_status_code=200, fetch_redirect_response=True) 
1

リダイレクトをテストするには、RequestFactoryの代わりにテストクライアントを使用する必要があります。

The API for the RequestFactory is a slightly restricted subset of the test client API:

  • It only has access to the HTTP methods get(), post(), put(), delete(), head(), options(), and trace().

  • These methods accept all the same arguments except for follows. Since this is just a factory for producing requests, it’s up to you to handle the response.

https://docs.djangoproject.com/en/1.11/topics/testing/advanced/#the-request-factory

そこに私が見つけたself.factory.get

response = self.client.get('/dossier/3/copier/', follow = True) 
関連する問題