Ошибка длины содержимого при тестировании конечных точек Google Cloud

#python #unit-testing #google-cloud-endpoints

#python #модульное тестирование #google-cloud-конечные точки

Вопрос:

Я получаю следующую ошибку всякий раз, когда хочу проверить путь к ошибке HTTP 404 в своем коде:

Ошибка утверждения: длина содержимого отличается от фактической длины app_iter (512! = 60)

Я создал минимальный образец, который вызывает такое поведение:

 import unittest
import endpoints
from protorpc import remote
from protorpc.message_types import VoidMessage
import webtest

@endpoints.api(name='test', version='v1')
class HelloWorld(remote.Service):
    @endpoints.method(VoidMessage, VoidMessage,
                      path='test_path', http_method='POST',
                      name='test_name')
    def test(self, request):
        raise endpoints.NotFoundException("Not found")

class AppTest(unittest.TestCase):
    def setUp(self):
        app = endpoints.api_server([HelloWorld])
        self.testapp = webtest.TestApp(app)

    # Test the handler.
    def testHelloWorldHandler(self):
        response = self.testapp.post('/_ah/spi/HelloWorld.test', extra_environ={
            'SERVER_SOFTWARE': 'Development/X', 'CONTENT_TYPE': 'application/json'})
  

Итак, что я делаю не так?

Комментарии:

1. Это полная ошибка? Я предполагаю, что нет…

2. Я тоже — это происходит, когда вы вызываете исключение конечных точек на сервере. Я нашел это trac.turbogears.org/ticket/2454 , но до сих пор не исправил это — я дам вам знать, когда сделаю 🙂

Ответ №1:

Это известная ошибка с App Engine.

Endpoints не устанавливает правильный заголовок длины содержимого при возникновении исключения:

https://code.google.com/p/googleappengine/issues/detail?id=10544

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

1. Откройте apiserving.py

На компьютере Mac вы можете найти файл по адресу:

 /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/endpoints-1.0/endpoints
  

2. Найдите следующий раздел (строка 467):

Это должно выглядеть так:

 headers_dict = dict([(k.lower(), v) for k, v in headers])
if self.__is_json_error(status, headers_dict):
  status, body = self.protorpc_to_endpoints_error(status, body)
  

3. Измените его на это:

 headers_dict = dict([(k.lower(), v) for k, v in headers])
if self.__is_json_error(status, headers_dict):
  pre_body_length = len(body)
  status, body = self.protorpc_to_endpoints_error(status, body)
  post_body_length = len(body)
  if pre_body_length != post_body_length:
    for index, header in enumerate(headers):
      header_key, _header_value = header
      if header_key == 'content-length':
        headers[index] = (header_key, str(post_body_length))
        break
  

4. Все сделано!

Конечные точки вернут правильную длину содержимого, webbob будет доволен, и ваши тесты API будут работать 🙂