Python 在GAE中对基于NDB的烧瓶应用程序进行单元测试时发生put()抛出错误
我正在单元测试用例中创建用户配置文件并试图保存它。代码如下:Python 在GAE中对基于NDB的烧瓶应用程序进行单元测试时发生put()抛出错误,python,google-app-engine,google-cloud-datastore,flask,nose,Python,Google App Engine,Google Cloud Datastore,Flask,Nose,我正在单元测试用例中创建用户配置文件并试图保存它。代码如下: def create_user(self, email, user_id, is_admin=False): self.testbed.setup_env( USER_EMAIL = email, USER_ID = user_id, USER_IS_ADMIN = '1' if is_admin else '0', overwrite = True)
def create_user(self, email, user_id, is_admin=False):
self.testbed.setup_env(
USER_EMAIL = email,
USER_ID = user_id,
USER_IS_ADMIN = '1' if is_admin else '0',
overwrite = True)
user = users.get_current_user()
print "user:", user
u = UserProf( id=str(user.user_id()),
nickname = "Test",
email_address = user.email() )
u.put()
我在执行测试用例时调用此函数,如下所示:
def test_users(self):
self.create_user('test@example.com', '123', True)
result = self.app('/users/')
self.assertTrue("Test" in result)
u、 put()导致了问题。错误:
BadKeyError:实体键与数据存储返回的键不同。预期键('UserProf','123'),获取键('UserProf','123'))
完整的stacktrace,它很大:
我在网上没有发现任何与这个错误有关的东西。除了一个,他还报告了同样的问题:
谢谢
更新:添加了UserProf的模型类
class UserProf(ndb.Model):
nickname = ndb.StringProperty(required=True)
email_address = ndb.StringProperty(required=True)
is_admin = ndb.BooleanProperty()
teams = ndb.KeyProperty(repeated=True)
is_manager = ndb.BooleanProperty()
在过去的几个小时里,我也遇到了同样的问题,最后我用nose gae和这个bug问题中指出的“无沙盒”标志运行了我的测试
我意识到这是一个老问题,但我想我会发表这篇文章,以防它可能会帮助其他人使用此错误来测试ndb。您必须为要在单元测试中使用的服务(包括数据存储)启用存根
类DemoTestCase(unittest.TestCase):
def设置(自):
#首先,创建Testbed类的实例。
self.testbed=testbed.testbed()
#然后激活测试台,它准备好服务存根以供使用。
self.testbed.activate()
#接下来,声明要使用的服务存根。
self.testbed.init_datastore_v3_stub()
self.testbed.init_memcache_stub()
请发布您的型号代码好吗?@codegeek:用型号代码更新了问题。您的型号中的用户ID在哪里?我看不出来。我猜您正在创建一个UserProf,userid作为字符串,而它应该是一个整数?id是user_id。在NDB中,我们可以使用'id'存储字符串或整数。我刚刚在本地开发服务器的交互式控制台中测试过,它工作得很好。当通过单元测试用例完成时,它不起作用。