2013-11-21 3 views
1

Я пишу некоторые модульные тесты для своего приложения Django в Google App Engine. В тестах используется заглушка хранилища данных, вызывая init_datastore_v3_stub и сохраняя в нем некоторые тестовые данные. Для простых моделей это прекрасно работает, но когда я храню модель B, которая является подклассом модели A, я получаю только результаты, если я запрашиваю модель как A. Пример кода:GAE Datastore Stub Issue

class A(db.polymodel.PolyModel): 
    ... 
class B(A): 
    .... 
B().put() 

print A.all().count() # prints 1 
print B.all().count() # prints 0 

Обратите внимание, что в производстве обеих линий напечатает 1. Любые предложения?

Обновление: Похоже, что проблема не связана с самой db, а с реализацией PolyModel. Я заметил, что B._entity не содержит значение 'class', как следует, но вместо этого содержит '_class'. Он выглядит так:

print B._entity # prints {... '_class'=[u'A', u'B'] ...} 

Это объясняет результат, который я получил. Когда я вручную установить значение 'class', все работает:

b = B() 
b._entity['class'] = b._entity['_class'] 
b.put() 

print B.all().count() # prints 1 

Я буду продолжать исследовать и обновлять здесь, когда я найти причину этой проблемы.

+1

Возможно, вы столкнетесь с возможной консистенцией. Вы должны это исключить, прежде чем рассматривать другую проблему. –

+0

Спасибо @TimHoffman за комментарий. Я попробовал добавить 'sleep (10)' перед отпечатками и еще такими же результатами. Что еще я могу сделать, чтобы исключить возможную консистенцию? – Tzach

+0

Получить ключ от объекта, который вы только что положили, а затем вызвать get(), и это позволит устранить возможную согласованность. –

ответ

0

нашел решение сам, это была ошибка в моем коде, в котором я случайно перезаписаны атрибут каждого свойства name быть имя члена класса поле, которая является _class для class имущества PolyModel. Это произошло во время создания моделей Mock для тестов, поэтому у меня не было этой проблемы в производстве.