6

「login_required」で装飾されたビューの(分離された)単体テストを行っています。例:

@login_required
def my_view(request):
    return HttpResponse('test')

「my_view」関数が「login_required」で装飾されていることをテストできますか?

統合テスト (テスト クライアントを使用) で動作 (匿名ユーザーがログイン ページにリダイレクトされる) をテストできることはわかっていますが、分離テストで実行したいと考えています。

何か案が?

ありがとう!

4

3 に答える 3

5

確かに、何らかの方法でテストできるはずです。しかし、それは間違いなく価値がありません。デコレータが適用されていることを確認するために完全に分離された単体テストを作成すると、非常に複雑なテストになります。テストされた動作が間違っているよりも、テストが間違っている可能性の方がはるかに高いです。私はそれを強く思いとどまらせます。

これをテストする最も簡単な方法は、Django を使用Clientして関連する URL へのリクエストを偽造し、リダイレクトを確認することです。Django のテストケースのいずれかを基本クラスとして使用している場合:

class MyTestCase(django.test.TestCase):
    def test_login_required(self):
        response = self.client.get(reverse(my_view))
        self.assertRedirects(response, reverse('login'))

RequestFactory を使用してビューを直接呼び出し、リクエスト オブジェクトを作成するという、もう少し複雑で独立したテストがあります。assertRedirects()によって設定された属性に依存するため、この場合は機能しませんClient

from django.test.client import RequestFactory

class MyTestCase(django.test.TestCase):
    @classmethod
    def setUpClass(cls):
        super(MyTestCase, cls).setUpClass()
        self.rf = RequestFactory()

    def test_login_required(self):
        request = self.rf.get('/path/to/view')
        response = my_view(request, *args, **kwargs)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], login_url)
        ...
于 2015-06-20T00:20:03.283 に答える