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

很抱歉的噪声。