Тестирование обработчика GAE с поддельным вошедшим пользователем - PullRequest
0 голосов
/ 14 января 2019

У меня есть рабочий сайт на GAE, и чтобы сохранить его, я пытаюсь добавить несколько юнит-тестов.

Одна из первых вещей, которые мне бы хотелось, это базовый тест на дым, который подтверждает, что аутентифицированный пользователь может загрузить домашнюю страницу. Вот моя попытка:

import webtest
import unittest
from google.appengine.api import users
from google.appengine.datastore import datastore_stub_util 
from google.appengine.ext import ndb
from google.appengine.ext import testbed

# Handler under test
import main
from common import User

class MainTestCase(unittest.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_user_stub()
        self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
            probability=0)
        self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
        self.testbed.init_memcache_stub()
        ndb.get_context().clear_cache()

    def tearDown(self):
        self.testbed.deactivate()

    def loginUser(self, email='user@example.com', id='123', is_admin=False):
        self.testbed.setup_env(
            user_email=email, user_id=id,
            user_is_admin='1' if is_admin else '0',
            overwrite=True)

    def testMainHandler(self):
        User(user_email='user@testing.com', is_admin = False).put()
        self.loginUser(email='user@testing.com')
        self.testapp = webtest.TestApp(main.app)
        response = self.testapp.get('/')
        self.assertEqual(response.status_int, 200)

Когда я запускаю этот тест, я получаю 403 вместо 200 и (с небольшим копанием) зарегистрированную ошибку, что «user@testing.com не зарегистрирован». Соответствующий бит main.py здесь:

try:
    active_email = users.get_current_user().email()
    user_acl = User.query(User.user_email == active_email).fetch(1)[0]
    security['user_exists'] = True
except IndexError:
    security['user_exists'] = False
    return security

Я подозреваю, что я правильно настраиваю пользователя (о чем свидетельствует зарегистрированный eror), но когда main.py запускает этот User.query, он обращается к «реальному» (пустому, во время тестирования) хранилищу данных вместо фальшивого версия тестового стенда, в которую я вставил тестового пользователя.

Это звучит правильно? Какие-нибудь советы, как сделать это лучше?

1 Ответ

0 голосов
/ 14 января 2019

Ваш запрос User.query(User.user_email == active_email).fetch(1) в конечном итоге непротиворечив, поэтому результаты метода put () могут отображаться не сразу. Сложив это, вы получаете self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy( probability=0), что делает эмулятор хранилища данных очень несовместимым. Возможно, вы захотите изменить свой запрос на строго согласованный или попробовать Cloud Firestore в режиме хранилища данных.

Для вашего теста вы можете установить вероятность = 1,0, чтобы увидеть, является ли проблема в конечном итоге непротиворечивым запросом.

...