当前位置: 首页 > 面试题库 >

您如何在App Engine中模拟用户服务?

欧阳学真
2023-03-14
问题内容

我正在使用Google App
Enginetestbed框架编写带有模拟对象的测试用例。这在此处记录。我已经使用模拟数据库(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

意味着假用户服务告诉我的应用程序当前用户尚未登录。我如何告诉假用户服务假装用户已登录?理想情况下,我希望能够指定假用户的昵称,电子邮件,user_id以及他们是否是管理员。似乎这是一件很普通的事情(因为您需要测试以下情况下应用程序的行为:a)没有人登录,b)用户登录,c)管理员登录),但是在谷歌搜索“
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()

问题答案:

好吧,我认为没有官方的方法可以做到这一点,但是我一直在阅读源代码,并且发现了一种“
hack”的方法,到目前为止效果很好。(通常我会担心使用未记录的行为,但这是一个测试套件,因此仅在开发服务器上有效时才有意义。)

开发服务器会根据以下三个环境变量确定当前登录的用户:

  • USER_EMAIL:用户的电子邮件地址 用户的昵称。
  • USER_ID:用户的唯一Google ID(字符串)。
  • USER_IS_ADMIN:如果用户不是管理员,则为“ 0”;如果用户为管理员,则为“ 1”。

您可以os.environ像设置任何其他环境变量一样使用它们来设置它们,它们会立即生效( 显然,这在生产服务器上将不起作用
)。但是您可以将它们与测试床的user_stub一起使用,并且当您停用测试床时,它们将被重置(您应该在上执行此操作tearDown,以便为每个测试用例获得全新的环境)。

由于设置环境变量有点笨拙,因此我编写了一些包装器函数来打包它们:

import os

def setCurrentUser(email, user_id, is_admin=False):
    os.environ['USER_EMAIL'] = email or ''
    os.environ['USER_ID'] = user_id or ''
    os.environ['USER_IS_ADMIN'] = '1' if is_admin else '0'

def logoutCurrentUser():
    setCurrentUser(None, None)


 类似资料:
  • 问题内容: 有没有一种简单的方法可以在模拟器内部模拟低内存?我有兴趣执行类似于此帖子的资源清理 问题答案: 从外壳调用命令。 这会将当前内存限制设置为10000 Kb,这样以后从此Shell调用的所有应用程序将无法访问更多内存。

  • 问题内容: 我正在使用felixge的客户端。我没有使用ORM。 我正在用Vows进行测试,并希望能够模拟我的数据库(可能使用Sinon)。由于除之外我本身还没有DAL ,因此我不确定如何执行此操作。我的模型大多是带有许多吸气剂的简单CRUD。 关于如何实现此目标的任何想法? 问题答案: 使用sinon,您可以在整个模块上放置一个模拟或存根。例如,假设模块具有一个功能: ,是您期望的输入。是您期望

  • 问题内容: 我正在使用felixge的客户端。我没有使用ORM。 我正在用Vows进行测试,并且希望能够使用Sinon来模拟我的数据库。由于除之外我本身还没有DAL ,因此我不确定如何执行此操作。我的模型大多是带有很多吸气剂的简单CRUD。 关于如何做到这一点的任何想法? 问题答案: 使用sinon,您可以在整个模块上放置一个模拟或存根。例如,假设模块具有一个功能: ,是您期望的输入。是您期望的输

  • 问题内容: 我有与请求对象或用户对象进行交互的Django代码。例如: 如果要使用django python shell进行测试或在单元测试中进行测试,您将在其中传递什么?这里只是一个User对象即可,但是对模拟请求对象的需求也经常出现。 对于外壳或单元测试: 您如何嘲笑用户? 您如何模拟请求? 问题答案: 对于请求,我将使用Django随附的RequestFactory。 对于用户,我将按照@o

  • 我正在创建一个通过EWS在Office 365 (Exchange online)中管理会议的应用程序。该应用程序应使用专用(服务)帐户,这将模拟组织者的帐户,并创建会议请求。该应用程序现在可以工作了,但我不确定在Office 365中创建服务帐户的最佳方式是什么,以及在这种情况下它需要的最低权限是什么。 目前,我在Office 365中创建了一个新用户,并在Exchange Admin中授予其<

  • 我知道Dan North设计BDD的意图之一是将词汇表从复杂的测试域中移开。然而,在实现由外到内的方法时,我们似乎仍然需要对模仿行为(或者,如果您愿意的话)有一些了解。North在这个视频中建议,如果我从最外层的域对象开始,然后向内工作,我会在发现合作者时模仿它们,然后用适当的实现替换它们。所以最后,我以一组端到端测试结束。 Martin Fowler在这篇博客文章中定义了TDD的两个阵营:“古典