Я пытаюсь протестировать приложение, которое работает на App Engine. Я использую инфраструктуру Testbed , и до сих пор она работает как чудо, за исключением следующего неожиданного поведения:
Такой тест будет работать нормально (упрощенная версия без фреймворка):
from google.appengine.ext import db, testbed
testbed = testbed.Testbed()
testbed.activate()
testbed.init_datastore_v3_stub()
class Foo(db.Model):
pass
# now for the tests:
key = Foo().put()
assert key == db.Key.from_path('Foo', key.id())
assert Foo.all(keys_only=True).get() == db.Key.from_path('Foo', key.id())
assert db.get(db.Key.from_path('Foo', key.id())) # fails!
testbed.deactivate()
Однако следующее не удастся (опять же, упрощенная версия):
from google.appengine.ext import db, testbed
testbed = testbed.Testbed()
testbed.activate()
testbed.init_datastore_v3_stub()
from myapp.models import Foo
# now for the tests:
key = Foo().put()
assert key == db.Key.from_path('Foo', key.id()) # fails!
assert Foo.all(keys_only=True).get() == db.Key.from_path('Foo', key.id()) # fails!
assert db.get(db.Key.from_path('Foo', key.id())) # fails!
# however, the following will succeed:
assert key == db.Key.from_path('Model', key.id())
assert Foo.all(keys_only=True).get() == db.Key.from_path('Model', key.id())
assert db.get(key)
testbed.deactivate()
Куда исчезает название модели во время испытаний? И почему это происходит только с импортированными модулями?
EDIT:
Спасибо Проппи , опечатки исправлены.
Ник Джонсон , позвольте мне попытаться объяснить это лучше.
Когда я запрашиваю результат из заглушки хранилища данных testbed
, я получаю сущность, как я и ожидал. Но когда я вызываю метод .key()
для этой сущности, я получаю такие вещи, как datastore_types.Key.from_path(u'Model', 1L, _app=u'testbed-test')
, тогда как Model
явно не соответствует моей сущности.
Когда я пытаюсь получить сущность для этого ключа (datastore_types.Key.from_path(u'Model', 1L, _app=u'testbed-test')
), он работает просто отлично.
Проблема в том, что когда я знаю только id
сущности хранилища данных, и я пытаюсь создать ключ вручную, используя db.Key.from_path(...)
.
Например, тип должен быть User
, поэтому я могу создать ключ, используя db.Key.from_path('User', 1)
. Но я не могу получить объект из хранилища данных, используя этот ключ. Однако я могу использовать db.Key.from_path('Model', 1)
, но, как я уже сказал, Model
не является правильным типом хранилища данных.
Другими словами:
from myapp.models import User
User(email='dont@write.us').kind() # returns 'Model', not 'User'!
Обратите внимание, что это неожиданное поведение не возникает в рабочей среде или на сервере разработки, только при использовании testbed
и только когда подкласс db.Model
определен в моем коде приложения (т.е. не в самих тестовых примерах).
Я не использую Django, я использую Pyramid с обходом, но выполняемые здесь модульные тесты не вызывают никакого кода, специфичного для фреймворка.
Обратите внимание, что Я не пробовал это с ndb
, но то же самое происходит и с ndb
.
Редактировать 2:
Очевидно, я не заметил, что все мои классы были подклассами подкласса google.appengine.ext.db.polymodel.PolyModel
, поэтому ключи на самом деле были правильно установлены как Model
, потому что тип Model
на всех подклассах PolyModel
.