在GAE中单元测试基于NDB的Flask应用程序时put()抛出错误

时间:2013-06-04 11:50:00

标签: 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)
    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')

完整的堆栈跟踪,它的大:

https://gist.github.com/rajendrakrp/5705313

我没有在网上找到与此错误相关的任何内容。除了一个,他也报告了同样的问题:https://gist.github.com/sivy/3364880

感谢。

更新:添加了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()

2 个答案:

答案 0 :(得分:3)

我在过去的几个小时内遇到了同样的问题,我最终用鼻子和标志“--without-sandbox”运行我的测试,如此错误问题所示https://code.google.com/p/nose-gae/issues/detail?id=60

我意识到这是一个老问题,但我想我会发布这个帖子,因为它可能会帮助其他人测试ndb这个错误。

答案 1 :(得分:0)

您必须为要在单元测试中使用的服务启用存根,包括数据存储。

class DemoTestCase(unittest.TestCase):

  def setUp(self):
    # First, create an instance of the Testbed class.
    self.testbed = testbed.Testbed()
    # Then activate the testbed, which prepares the service stubs for use.
    self.testbed.activate()
    # Next, declare which service stubs you want to use.
    self.testbed.init_datastore_v3_stub()
    self.testbed.init_memcache_stub()