Почему это перечисляет этот путь? - PullRequest
1 голос
/ 28 сентября 2011

Для следующей функции

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",

строка 36, в testget2000 self.assertEqual (len (s), 7) AssertionError: AssertionError: 5! = 7

-------------------- >> начать захваченный стандартный вывод << </h2> 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

Я действительно не понимаю, почему «из» печатается раньше, «внутри» в первый раз. Кроме того, почему он выделяет одни и те же первые несколько идентификаторов дважды? Я создаю какое-то странное закрытие? Является ли KEYS другим объектом в обработчике исключений, чем за его пределами? Я потерян.

Ответы [ 3 ]

1 голос
/ 29 сентября 2011

Как предлагает Дрю, вы можете добавить

global KEYS
KEYS = {}

к началу вашего теста (или лучше к setUp методу), но корень вашей проблемы в дизайне: функции, которые используют лениво инициализируемое, изменяемое глобальное состояние, трудно проверить. Создание класса KeyFactory с KEYS в качестве переменной экземпляра может помочь вам лучше.

Чего вы пытаетесь достичь, делая это?

1 голос
/ 29 сентября 2011

Похоже, что когда начинается ваш захваченный вывод, хранилище данных пусто, но KEYS[kind] уже имеет два заполненных значения.Хранилище данных не выделяет одинаковые идентификаторы дважды, у вас просто есть оставшиеся идентификаторы, которые никогда не выделялись.Либо отследите, что еще пишет в KEYS, либо просто сотрите это в начале теста.

Кроме того, вы, кажется, передаете реальный класс модели для своего рода.Key.from_path ожидает строку, например 'Model1' вместо Model1.

0 голосов
/ 29 сентября 2011

Похоже, что-то вызывает get(kind) до того, как ваш модульный тест начинает захватывать, или KEYS заполняется каким-либо образом до того, как все начнется.

Возможно, просто добавьте raise Exception или иначе напечатайте трассировку вget(kind) и убедитесь, что в первый раз он запускается из вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...