python - 为什么要这样枚举呢?

标签 python unit-testing google-app-engine

对于以下函数

KEYS = {}    
def get(kind):
    "returns a new key of a particular kind"
    global KEYS

    try:
        return KEYS[kind].pop(0)
    except (KeyError, IndexError):
        handmade_key = Key.from_path(kind, 1)
        start, end = allocate_ids(handmade_key, 3)
        id_range = range(start, end+1)
        KEYS[kind] = [Key.from_path(kind, id) for id in id_range]
        for key in KEYS[kind]:
            print "within get() -> %s:%s"%(key, key.id())
        return get(kind)

我编写了以下单元测试

def testget2000(self):
    s = set()
    for i in range(0, 7):
        key = keyfactory.get("Model1")
        print "from get()   -> %s:%s"%(key, key.id())
        s.add(key)
    self.assertEqual(len(s), 7)
    self.assertEqual(len([k.id for k in s]), 2000)

并出现以下错误

FAIL: testget2000 (keyfactory_test.ModelTest)

Traceback (most recent call last):
  File "/home/vertegal/work/ei-sc/appengine/keyfactory_test.py",

line 36, in testget2000 self.assertEqual(len(s), 7) AssertionError: AssertionError: 5 != 7

-------------------- >> begin captured stdout <<

from get()   -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAgw:2
from get()   -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAww:3
within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAQw:1
within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAgw:2
within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAww:3
from get()   -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAQw:1
from get()   -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAgw:2
from get()   -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAww:3
within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBAw:4
within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBQw:5
within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBgw:6
from get()   -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBAw:4
from get()   -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBQw:5

我真的不明白为什么第一次要在“within”之前打印“from”。另外,为什么它会两次分配相同的前几个 id?我是否创建了一些奇怪的闭包?异常处理程序中的 KEYS 与外部的对象是否不同?我迷路了。

最佳答案

因此,当您捕获的输出开始时,数据存储区为空,但 KEYS[kind]有两个值已填充。数据存储不会两次分配相同的 ID,您只是拥有从未分配过的剩余 ID。要么追踪其他写入 KEYS 的内容,或者在测试开始时将其清除。

此外,您似乎正在传递实际的模型类。 Key.from_path需要一个字符串,例如'Model1'而不是Model1 .

关于python - 为什么要这样枚举呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7588878/

相关文章:

python - Pandas 多索引数据框将列中的第一行设置为 0

python - 在 odoo 中出现这样的错误

c# - 如何在单元测试中模拟字符串响应?

unit-testing - 对 Firebase : what's the "right way" to test/mock `transaction` s with sinon. js 的 Cloud Functions 进行单元测试

python - 使用 catch all 捕获 url 不渲染 css

python,通过坐标从DAS获取序列

python - 为什么一个简单的 python 生产者/消费者多线程程序不能通过增加 worker 数量来加速?

unit-testing - 使用 Jest 模拟的服务会导致 "The module factory of jest.mock() is not allowed to reference any out-of-scope variables"错误

android - Android Webview-HTTP错误504网关超时

python - 无法让 gcloud 与 Python 和 Pycharm 配合使用