使用假登录用户测试 GAE 处理程序

Testing a GAE handler with a fake logged in user

我在 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 is not registered"。 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

我怀疑我设置的用户是正确的(如记录的错误所证明)但是当 main.py 运行 是 User.query 时,它击中了 "real"(测试期间为空)数据存储,而不是我插入测试用户的假测试平台版本。

这听起来对吗?关于如何更好地做到这一点的任何提示?

您的查询 User.query(User.user_email == active_email).fetch(1) 是最终一致的,因此 put() 的结果可能不会立即显示。更复杂的是,您有 self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy( probability=0) 导致数据存储模拟器非常不一致。您可能需要考虑将查询更改为高度一致或在 Datastore 模式下尝试 Cloud Firestore。

对于您的测试,您可以设置 probability=1.0 来查看问题是否为最终一致性查询。