В дополнение к ответу Биджан :
Фактическая проверка в google.appengine.api.users
выглядит следующим образом:
def is_current_user_admin():
return (os.environ.get('USER_IS_ADMIN', '0')) == '1'
Таким образом, ключ для установкипеременная окружения от USER_IS_ADMIN
до '1'
.Это можно сделать несколькими способами, но учтите, что вы изменяете глобальную переменную, и, таким образом, это может повлиять на другой код.Ключ должен сделать надлежащую очистку.
Можно использовать библиотеку Mock от до патча os.environ
, использовать Testbed
илисвернуть свой творческий путь.Я предпочитаю использовать Testbed
, поскольку это намекает на то, что хак связан с appengineМакет не включен в версии Python до 3.3, поэтому это добавляет дополнительную тестовую зависимость.
Дополнительное примечание: При использовании unittest
модуля я предпочитаю использовать addCleanup
вместо tearDown
, поскольку очистки также вызываются при сбое setUp
.
Пример теста:
import unittest
from google.appengine.api import users
from google.appengine.ext import testbed
class AdminTest(unittest.TestCase):
def setUp(self):
tb = testbed.Testbed()
tb.activate()
# ``setup_env`` takes care of the casing ;-)
tb.setup_env(user_is_admin='1')
self.addCleanup(tb.deactivate)
def test_is_current_user_admin(self):
self.assertTrue(users.is_current_user_admin())
Примечание: Testbed.setup_env
следует вызывать после Testbed.activate
.Testbed
делает снимок os.environ
при активации, этот снимок восстанавливается при деактивации.Если Testbed.setup_env
вызывается перед активацией, вместо временного экземпляра изменяется действительный os.environ
, что эффективно загрязняет окружающую среду.
Это ведет себя так, как должно:
>>> import os
>>> from google.appengine.ext import testbed
>>>
>>> tb = testbed.Testbed()
>>> tb.activate()
>>> tb.setup_env(user_is_admin='1')
>>> assert 'USER_IS_ADMIN' in os.environ
>>> tb.deactivate()
>>> assert 'USER_IS_ADMIN' not in os.environ
>>>
Это загрязняетокружающая среда:
>>> import os
>>> from google.appengine.ext import testbed
>>>
>>> tb = testbed.Testbed()
>>> tb.setup_env(user_is_admin='1')
>>> tb.activate()
>>> assert 'USER_IS_ADMIN' in os.environ
>>> tb.deactivate()
>>> assert 'USER_IS_ADMIN' not in os.environ
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError