2013-02-24 59 views
2

我正在使用django-webtest(v1.5.6)來測試裝飾器是否限制對已驗證用戶的視圖訪問。django-webtest,用戶驗證和視圖裝飾器

我的觀點是簡單地:

@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') 

(使用來自G功能創建的用戶對象django-dynamic-fixture

運行測試時,修飾器阻止訪問homepage視圖。

您可以看到我使用pdb來檢查對象。用戶是否是有效用戶對象應該通過所有的測試在active_account_required裝飾:

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

儘管用戶是正確的,從self.app.get(reverse('account_homepage'), user = user)響應是302重定向到registration_activation_incomplete URL作爲每裝飾代碼:

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

看來用戶對象沒有在WebTest請求中正確發送,但是它與django-webtest documentation匹配。我也嘗試通過用戶名作爲user='2'傳遞用戶,但獲得相同的結果。

任何想法?

回答

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()得到它的工作:)

很抱歉的噪聲。