Неправильные ключи хранилища данных в тестовом стенде - PullRequest
1 голос
/ 17 января 2012

Я пытаюсь протестировать приложение, которое работает на 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.

1 Ответ

0 голосов
/ 04 июня 2012

Чтобы ответить на мой собственный вопрос, эта проблема была вызвана файлом под названием migrations.py, который у меня был в моем проекте, который переопределял мои модели с использованием классов, которые имели разные свойства. Когда я запускал тесты, nose пытался импортировать все доступные файлы для публикации результатов покрытия, что вызвало конфликт определения модуля и, таким образом, всю путаницу.

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