Веб-тест: тестирование с декораторами + вызовы хранилища данных

У меня есть приложение Google App Engine, и у моего запроса hasnler есть декоратор, который выполняет аутентификацию. С помощью 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)

Итак, теперь мне нужно каким-то образом внедрить функциональность профиля в декоратор, чтобы я мог установить его в своих тестах. У кого-нибудь есть идея, как это сделать? Я пытался придумать способ, но я все время застреваю.


person Pickels    schedule 29.08.2010    source источник
comment
Думаю вопрос не очень ясен. Вы хотите знать, как протестировать декоратор? Что вы подразумеваете под внедрением функциональности профиля в декоратор?   -  person moraes    schedule 30.08.2010
comment
Я имею в виду, что в своем тесте я хочу иметь возможность контролировать профиль, который я получаю из хранилища данных. Чтобы я мог проверить, что, если профиль не существует, пользователь перенаправляется на новую страницу пользователя.   -  person Pickels    schedule 30.08.2010


Ответы (1)


Вы должны создать профиль во время теста, который будет использоваться декоратором:

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')
person moraes    schedule 30.08.2010
comment
Кажется, я немного задумался. Я в основном привык к Asp.net Mvc, и там вы все разделяете, чтобы его можно было протестировать. Но я заметил, что в GAE тесты в основном интеграционные. - person Pickels; 30.08.2010