2012-01-17 2 views
1

App Engine에서 실행되는 응용 프로그램을 테스트하려고합니다. 나는 the Testbed framework를 사용하고, 지금까지 다음과 같은 예기치 않은 동작을 제외하고 매력처럼 작동합니다테스트 베드의 데이터 저장소 키가 잘못되었습니다.

이 같은 테스트 것 잘 (프레임 워크없이 단순화 된 버전) 일 :

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() 

어디 모델 이름이 시험 중에 사라는 무엇입니까? 그리고 가져온 모듈에서만 어떻게됩니까?

편집 :

감사 proppy, 고정 오타.

, 더 잘 설명하겠습니다.

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='[email protected]').kind() # returns 'Model', not 'User'! 

db.Model 서브 클래스가 내 응용 프로그램 코드에서 정의 될 때이 예기치 않은 동작은 testbed을 사용하는 경우에만 생산 또는 dev에 서버에서 발생하지 않습니다 (즉, 테스트 케이스 자체는 아닙니다).

장고를 사용하지 않고 피라미드를 탐색하고 있지만 여기에서 실행중인 단위 테스트에서는 프레임 워크 관련 코드를 호출하지 않습니다.

나는 .. ndb 아직 같은 일뿐만 아니라 ndb으로 발생하여이 시도하지 않은

편집 2 주 있음 : 분명히

나는 그 모두를 발견하지 않았습니다 내 클래스는 서브 클래스가 google.appengine.ext.db.polymodel.PolyModel이므로 서브 클래스가 PolyModel 인 경우 Model이기 때문에 실제로 키는 Model으로 올바르게 설정되었습니다.

+1

나는 당신의 코드에 오타가 있다고 생각한다. Triu/True/g – proppy

+0

그래서이 경우'key'는 무엇일까요? 추가 정보 없이는 진단하기가 어렵습니다. 그리고 장고를 사용하고 있습니까? –

+0

@NickJohnson, 업데이트를 참조하십시오. –

답변

0

내 자신의 질문에 대답하려면이 문제는 다른 속성을 가진 클래스를 사용하여 내 모델을 재정의 한 내 프로젝트에서 가지고 있던 migrations.py이라는 파일 때문에 발생했습니다. 테스트를 실행할 때, nose은 사용 가능한 모든 파일을 가져 와서 커버리지 결과를 게시하려했는데, 이로 인해 모듈 정의 충돌이 발생하여 모든 혼란이있었습니다.