29

私は Django プロジェクトの単体テストをいくつか書いていますが、私が書いたデコレータのいくつかをテストすることが可能か (または必要か?) 疑問に思っていました。

私が書いたデコレータの例を次に示します。

class login_required(object):

    def __init__(self, f):
        self.f = f

    def __call__(self, *args):
        request = args[0]
        if request.user and request.user.is_authenticated():
            return self.f(*args)
        return redirect('/login')
4

4 に答える 4

32

単に:

from nose.tools import assert_equal
from mock import Mock

class TestLoginRequired(object):
    def test_no_user(self):
        func = Mock()
        decorated_func = login_required(func)
        request = prepare_request_without_user()
        response = decorated_func(request)
        assert not func.called
        # assert response is redirect

    def test_bad_user(self):
        func = Mock()
        decorated_func = login_required(func)
        request = prepare_request_with_non_authenticated_user()
        response = decorated_func(request)
        assert not func.called
        # assert response is redirect

    def test_ok(self):
        func = Mock(return_value='my response')
        decorated_func = login_required(func)
        request = prepare_request_with_ok_user()
        response = decorated_func(request)
        func.assert_called_with(request)
        assert_equal(response, 'my response')

ここでモックライブラリが役立ちます。

于 2010-04-30T09:52:06.517 に答える
1

このようなデコレータは、ダックタイピングのおかげでテストされる可能性があります。要求として保持および機能しているように見えるモックオブジェクトを呼び出し関数に指定するだけで、期待どおりの動作が得られるかどうかを確認できます。

ユニットテストを使用する必要がある場合は、かなり個人的なことだと思います。あなたが与える例は、それが必要ではないと言うかもしれないような基本的なコードを含んでいます。しかし、繰り返しになりますが、このようなクラスをテストするコストも同様に低くなります。

于 2010-04-29T15:48:33.980 に答える
1

Django の UnitTest の例

class TestCaseExample(TestCase):
    def test_decorator(self):
        request = HttpRequest()
        # Set the required properties of your request
        function = lambda x: x
        decorator = login_required(function)
        response = decorator(request)
        self.assertRedirects(response)

一般的に、私が利用したアプローチは次のとおりです。

  1. リクエストを設定します。
  2. デコレータ マジック (ラムダ) を実行できるようにするダミー関数を作成します。ここで、最終的にデコレータに渡される引数の数を制御できます。
  3. デコレーターの応答に基づいてアサーションを実行します。
于 2014-03-05T22:46:25.623 に答える