2017-06-14 112 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後創建密鑰。