2017-06-14 56 views
2

这里是我的Python类BadRequestError:应用“测试平台测试”无法访问应用程序“_”的数据

from app.commons.abstract.dal import ndbService 
from google.appengine.ext import ndb 
from app.conference.models.conference import ConferenceNDB, ConferenceMessageNDB 


conference_key = ndb.Key('Conference', 'CFC Australia') 


    class ConferenceService(ndbService): 
     def convert_to_object(self, value): 
      conf = ConferenceNDB(parent=conference_key) 
      conf.name = value['name'] 
      conf.year = value['year'] 
      conf.description = value['description'] 
      return conf 

     def write(self, value): 
      conference = self.convert_to_object(value) 
      return conference.put() 

     def read(self, value): 
      key = ndb.Key(urlsafe=value) 
      conference = key.get() 
      return conference 

     def remove(self, value): 
      pass 

这里是单元测试

def test_conference_write(self): 
     conf = {'name': 'xxxx', 
       'year': 2017, 
       'description': 'xxxx'} 

     svc_conf = ConferenceService() 
     key = svc_conf.write(conf) 
     print(key) 
     self.assertIsNotNone(key) 

我的单元测试失败与跟随错误。

Error 
Traceback (most recent call last): 
    File "C:\Python27\lib\unittest\case.py", line 329, in run 
    testMethod() 
    File "C:\Code\App-Engine\cfc-melbourne-website\tests\test_conference.py", line 40, in test_conference_write 
    key = svc_conf.write(conf) 
    File "C:\Code\App-Engine\cfc-melbourne-website\app\admin\services\conferenceservice.py", line 19, in write 
    return conference.put() 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 3458, in _put 
    return self._put_async(**ctx_options).get_result() 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\tasklets.py", line 383, in get_result 
    self.check_success() 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\tasklets.py", line 427, in _help_tasklet_along 
    value = gen.throw(exc.__class__, exc, tb) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\context.py", line 824, in put 
    key = yield self._put_batcher.add(entity, options) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\tasklets.py", line 427, in _help_tasklet_along 
    value = gen.throw(exc.__class__, exc, tb) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\context.py", line 358, in _put_tasklet 
    keys = yield self._conn.async_put(options, datastore_entities) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\tasklets.py", line 513, in _on_rpc_completion 
    result = rpc.get_result() 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 613, in get_result 
    return self.__get_result_hook(self) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\datastore\datastore_rpc.py", line 1879, in __put_hook 
    self.check_rpc_success(rpc) 
    File "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\datastore\datastore_rpc.py", line 1371, in check_rpc_success 
    raise _ToDatastoreError(err) 
BadRequestError: app "testbed-test" cannot access app "_"'s data 

----------- UPDATE ------- 2017年8月21日

在我testbase使用下面的代码固定它

def setUp(self): 
    self.testbed = testbed.Testbed() 
    self.testbed.setup_env(
     app_id='_', 
     overwrite=True 
    ) 
    self.testbed.activate() 
    self.testbed.init_datastore_v3_stub() 
    self.testbed.init_memcache_stub() 
    ndb.get_context().clear_cache() 

回答

1

键包含app_id。你可以通过key.app()看到它。

默认app_id是'_'。您的conference_key是在导入源文件时使用默认app_id('_')制作的。

之后,您将app_id设置为应用程序某处的“testbed-test”。然后所有密钥都包含app_id('testbed-test'),并且您的密钥不匹配。

因此,在设置app_id后创建密钥。