Я использую платформу Google App Engine testbed
для написания тестовых примеров с макетными объектами. Это описано здесь. У меня есть тесты на хранилище данных, которые хорошо работают с помощью базы данных mock (Testbed.init_datastore_v3_stub
), и это позволяет моим тестовым примерам работать над быстрой и свежей базой данных, которая повторно инициализируется для каждого тестового примера. Теперь я хочу протестировать функциональность, которая зависит от текущего пользователя.
Существует еще один тестовый сервис под названием Testbed.init_user_stub
, который я могу активировать, чтобы получить "поддельную" службу пользователя. К сожалению, для этого нет никакой документации. Я активирую и использую его следующим образом:
import unittest
from google.appengine.ext import testbed
from google.appengine.api import users
class MyTest(unittest.TestCase):
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_user_stub()
def testUser(self):
u = users.get_current_user()
self.assertNotEqual(u, None)
Проблема в том, что я не нашел способа сказать "поддельной" службе пользователя аутентифицировать "поддельного" пользователя. Поэтому, выполняя этот тест, я (предсказуемо) получаю
AssertionError: None == None
означает, что поддельная пользовательская служба сообщает моему приложению, что текущий пользователь не вошел в систему. Как я могу сказать, что поддельная пользовательская служба делает вид, что пользователь вошел в систему? В идеале я хотел бы указать псевдоним пользователя, email, user_id и независимо от того, является ли он администратором. Похоже, это было бы довольно обычным делом (поскольку вам нужно проверить, как приложение ведет себя, когда a) никто не вошел в систему, b) пользователь вошел в систему и c) администратор зарегистрировался), но googling "init_user_stub" почти ничего не возвращает.
Примечание. Если вы хотите протестировать вышеуказанную программу, вам нужно добавить это вверху:
import sys
sys.path.append('/PATH/TO/APPENGINE/SDK')
import dev_appserver
dev_appserver.fix_sys_path()
и это снизу:
if __name__ == '__main__':
unittest.main()