2017-03-10 20 views
2

マイビューファイルがあります:テスト@user_passes_testデコレータを使用してリダイレクト

def is_authorised(user): 
    return user.groups.filter(name='bookkeepers').exists() 

@login_required 
def unauthorised(request): 
    context = {'user': request.user} 
    return render(request, 'order_book/unauthorised.html', context) 

@login_required 
@user_passes_test(is_authorised, 
        login_url='/order_book/unauthorised/', 
        redirect_field_name=None) 
def book(request): 
    return render(request, 'order_book/book.html', {}) 

は、私がこれまでのところ、私はこれを持って、正しくリダイレ​​クトさん許可されていないユーザーでログインしていることを主張するテストを書きたいです

class RestrictedViewsTest(TestCase): 

    @classmethod 
    def setUpTestData(cls): # noqa 
     """Set up data for the whole TestCase.""" 
     User.objects.create_user(username='JaneDoe', 
           email='[email protected]', 
           password='s3kr3t') 

    def setUp(self): 
     auth = self.client.login(username='JaneDoe', password='s3kr3t') 
     self.assertTrue(auth) 

    def test_book(self): 
     response = self.client.get('/order_book/book') 
     self.assertEqual(response.status_code, 301, response) 
     self.assertTrue(isinstance(response, HttpResponsePermanentRedirect)) 

    def tearDown(self): 
     self.client.logout() 

これは問題なく動作しますが、どこにURLをリダイレクトするかはわかりません。 response['Location']を取得しようとすると、私に「/ order_book/book」が届きません。

私は間違っていますか?

+1

あなたは 'self.client.get(「/ order_book /書籍/」)'内のURLの最後に不足しているスラッシュを追加した場合、私は '応答[「場所」]'あなたを与えるべきだと思います'/ order_book/unauthorized /'を使用してください。しかし、私はあなたの答えで 'assertRedirects'メソッドを使うことをお勧めします。 – Alasdair

+1

@Alasdair入力ミスが修正されるとすぐに、リダイレクトコードは私が予想していた302に戻ります。 – Sardathrion

答えて

2

assertRedirectsメソッドを使用できます。

def test_book(self): 
    response = self.client.get('/order_book/book/') 
    self.assertRedirects(response, '/order_book/unauthorised/', status_code=302, target_status_code=200) 
+0

ステータスコードを301に変更した後、「AssertionError:リダイレクトページを取得できませんでした」/ order_book/book/':レスポンスコードが302(予想200) '...☹ – Sardathrion

+0

最後にスラッシュがありません'/ order_book/book' - Djangoは'/order_book/book'から '/ order_book/book /'に '/ order_book/unauthorized /'にリダイレクトしています。 – Alasdair

+0

Err ...今私は羊を感じる☺ありがとう。 – Sardathrion

関連する問題