2010-08-29 60 views
1

我有一个Google App Engine应用程序,我的请求hadnler有一个装饰器来执行身份验证。通过WebTest,我发现yesterday如何设置登录用户和管理员。WebTest:使用装饰器+数据存储区调用进行测试

今天我的身份验证装饰器变得更复杂一点了。它还会检查用户是否在数据库中有配置文件,并且他是否不会将其重定向到“新用户”页面。

def authenticated(method): 
    @functools.wraps(method) 
    def wrapper(self, *args, **kwargs): 
     user = users.get_current_user() 
     if not user: 
      self.redirect(users.create_login_url(self.request.uri)) 
      return 

     profile = Profile.get_by_key_name(str(user.user_id)) 
     if not profile: 
      self.redirect('/newuser') 

     return method(self, *args, **kwargs) 

    return wrapper 

现在增加型材件打破我的单元测试来检查,如果一个用户登录并获得一个状态代码200(assertOK)。

def user_ok(self): 
    os.environ['USER_EMAIL'] = '[email protected]' 
    os.environ['USER_IS_ADMIN'] = '' 
    response = self.get('/appindex') 
    self.assertOK(response) 

所以现在我需要能够以某种方式注入配置文件功能到装饰,所以我可以把它在我的测试。有人知道如何做到这一点我一直在想办法,但我一直在卡住。

+0

我觉得这个问题不是很清楚。你想知道如何测试装饰者? “将配置文件功能注入装饰器”是什么意思? – moraes 2010-08-29 23:35:29

+0

我的意思是说,在我的测试中,我希望能够控制从数据存储获得的配置文件。所以我可以测试,如果配置文件不存在,用户会被重定向到新的用户页面。 – Pickels 2010-08-29 23:51:33

回答

2

你应该在测试过程中创建一个配置文件,要使用的装饰:

def user_ok(self): 
    key_name = '[email protected]' 
    new_user = Profile(key_name=key_name) 
    new_user.put() 

    os.environ['USER_EMAIL'] = key_name 
    os.environ['USER_ID'] = key_name 
    os.environ['USER_IS_ADMIN'] = '' 
    response = self.get('/appindex') 
    self.assertOK(response) 

    # Now let's reset it to check that the user will be redirected. 
    new_user.delete() 
    response = self.get('/appindex') 
    self.assertEqual(response.headers['Location'], 'http://localhost/newuser') 
+0

似乎我已经在想这个了。我大多习惯于使用Asp.net Mvc,并在那里解耦所有可以测试的东西。但我注意到GAE中的测试主要是集成测试。 – Pickels 2010-08-30 11:42:37