2017-12-07 18 views
0

URLでテストを実行すると、200ではなく302が返されます。リダイレクトテスターでプロダクションで同じURLをテストすると、200が返されます。Django Test client.get()は200の代わりに302コードを返します

tests.py

def test_detail(self): 
    response = self.client.get('/p/myproduct-detail.html') 
    self.assertEqual(response.status_code, 200) 

urls.py

url(r'^p/(?P<slug>[-\w\d]+).html$', main.views.product_detail, 
     name='product-detail'), 

views.py

def product_detail(request, slug): 
    stuff... 
    return render(request, 'product-detail.html', {}) 

私はclient.get()follow=Trueを追加する場合は、予想通り、私は200のコードを受け取ります。

+0

ブラウザでURLを開くと、最後に表示されるURLは/p/myproduct-detail.htmlまたは/p/myproduct-detail.html/ですか? – Kostas

+0

@Kostas /p/myproduct-detail.html – KingFu

答えて

1

あなたのassertEqual行の前にテストでresponse['location']の値を印刷します。クライアントがリダイレクトされている場所(ログインページなど)が表示されます。

def test_detail(self): 
    response = self.client.get('/p/myproduct-detail.html') 
    print(response['location']) 
    self.assertEqual(response.status_code, 200) 
+0

ありがとうございます。「/」を返します。ああ、私はこれで分かったと思います.Http404()を呼び出してインデックスにリダイレクトする必要があります。これはテストを作成した初めてのことですが、私はそれがdev dbのコピーを使用していると仮定しましたが、今はそうではありません。 – KingFu

+1

Djangoが作成するテストデータベースは、あなたのdevdbのコピーではありません。たとえば、['setupTestData'](https://docs.djangoproject.com/ja/1.11/topics/testing/tools/#django.test)を使用して、テストを実行する前にテストデータベースにオブジェクトを作成する必要があります。 .TestCase.setUpTestData)。 – Alasdair

関連する問題