#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 будут работать 🙂