2

django-webtest (v1.5.6) を使用して、デコレータがビューへのアクセスを認証済みユーザーに制限していることをテストしています。

私の見解は単純です:

@active_account_required
def homepage(request):
    return render(request, 'accounts/account_homepage.html', {
        'user': request.user,
        })  

active_account_requiredデコレータは次のとおりです。

def active_account_required(function = None):
    """ 
    Check the user is both logged in and has a valid, activated user account.

    If a user tries to access a view protected by this decorator, they will be
    redirected accordingly.

    See http://passingcuriosity.com/2009/writing-view-decorators-for-django/
    """

    def _dec(view_func):
        def _view(request, *args, **kwargs):
            if request.user.is_anonymous():
                return HttpResponseRedirect(reverse_lazy('auth_login'))
            if not request.user.get_profile().is_activated():
                return HttpResponseRedirect(reverse_lazy('registration_activation_incomplete'))
            return view_func(request, *args, **kwargs)

        _view.__name__ = view_func.__name__
        _view.__dict__ = view_func.__dict__
        _view.__doc__ = view_func.__doc__

        return _view

    if function is None:
        return _dec
    else:
        return _dec(function)

私のテスト方法は

class AccountViewsTests(WebTest):
    def test_activated_user_can_access_account_homepage(self):
        """ 
        Test an activated user can access the account homepage
        """
        user = G(User)
        user.get_profile().datetime_activated = timezone.now()
        res = self.app.get(reverse('account_homepage'), user = user)
        pdb.set_trace()
        self.assertTemplateUsed(res, 'accounts/account_homepage.html',
                'Activated account did not access account homepage correctly')

(ユーザー オブジェクトはdjango-dynamic-fixtureGの関数を使用して作成されます)

テストを実行すると、デコレーターがhomepageビューへのアクセスを妨げています。

pdbオブジェクトの検査に使用していることがわかります。active_account_requiredUser は、デコレータのすべてのテストに合格する有効なユーザー オブジェクトです。

(Pdb) user
<User: 2>
(Pdb) user.is_anonymous()
False
(Pdb) user.get_profile().is_activated()
True

ユーザーが正しいにもかかわらず、からの応答は、デコレータ コードに従って URLself.app.get(reverse('account_homepage'), user = user)への 302 リダイレクトです。registration_activation_incomplete

(Pdb) res
<302 FOUND text/html location: http://localhost:80/accounts/registration/activate/incomplete/ no body>

WebTest リクエストでユーザー オブジェクトが正しく送信されていないようですが、これはdjango-webtest のドキュメントと一致します。また、ユーザー名でユーザーを渡そうとしましuser='2'たが、同じ結果が得られました。

何か案は?

4

1 に答える 1

0

おっと-問題は、アクティベーションタイムスタンプを設定した後、ユーザープロファイルを保存するのを忘れただけです!

テストコードを次のように変更します。

user = G(User)
user.get_profile().datetime_activated = timezone.now()
user.get_profile().save()
res = self.app.get(reverse('account_homepage'), user = user)

つまり、追加するuser.get_profile().save()と機能します:)

騒音でごめんなさい。

于 2013-02-24T17:51:57.817 に答える