2016-10-29 6 views
3

Я использую appengine и golang для разработки простых API RESTful. Код работает нормально, когда я запускаю службу с помощью goapp-сервиса, и начал писать тестовые функции модуля для тестирования конечных точек API, и здесь меня поразила паническая ошибка appengine: NewContext passed an unknown http.Request. Я получаю эту ошибку, когда я запускаю goapp test.golang appengine api test error "appengine: NewContext прошел неизвестный http.Request"

Похоже на какой-то причине, я не в состоянии передать запрос, который я создал и передать его appengine.NewContext()

Ниже приведен фрагмент кода ..

body := strings.NewReader("") 

request, err := http.NewRequest("GET", "endpoint url", body) //inst.NewRequest("GET", goalUrl, body) // 
if err != nil { 
    t.Error(err) 
} 
t.Log(request) 

c := appengine.NewContext(request) // ERROR: appengine: NewContext passed an unknown http.Request 

У меня есть создал simple reproducible code. ты можешь помочь мне с этим? или Кто-нибудь имеет свой проект API golang на appengine и имеет функции тестирования модулей для тестирования конечных точек, я хотел бы взглянуть на их код ...

Вот, который я опубликовал, в котором есть все необходимые сведения о проблеме вместе с примерами и подробным сообщением об ошибке. Спасибо за вашу помощь.

ответ

2

Извинения за задержку в ответе. Я сам работал над решением

Вот как я решил проблему модульных тестов appengine: полный код решения можно найти на this github repo branch.

В файле * _test.go я использовал следующее.

  • httptest.NewServer (..), чтобы создать новый экземпляр тестового сервера. также используется для захвата базового URL-адреса службы, который используется при подготовке объекта запроса.
  • aetest.NewContext(), чтобы создать новый контекст для целей тестирования
  • http.NewRequest (..), чтобы создать новый запрос
  • горилл context.Set (..), чтобы назначить клавишу («контекст») , значение (контекст, созданный на предыдущем шаге), к запросу, созданному выше
  • httptest.NewRecorder() новый рекордер для сохранения результатов
  • http.Handler.ServeHTTP (..) передача записанных и запросов. используется, чтобы сделать запрос API

Для каждого кода обработчика API, вместо того, чтобы непосредственно создавать новый контекст с помощью appengine.NewContext, у меня коды описаны в приведенном ниже sudocode

using the gorilla's context.GetOk(..), check 
    IF the received request object has the key "Context" 
    THEN using value of that key as the context 
    ELSE derive context using appengine.NewContext(r) 

Я обернутой многоразовый функциональность в отдельную библиотеку под названием aeunittest и использовали ее в моем коде.

С помощью этой установки я могу запустить тест goapp для запуска модульных тестов.см. solved code для получения полной информации о решении.

Вот блог, который помог мне найти это решение. Большое спасибо. TESTING GO HTTP HANDLERS IN GOOGLE APP ENGINE WITH MUX AND HIGHER ORDER FUNCTIONS.

1

NewContext получает контекст от flight HTTP requests, то есть тех, которые были зарегистрированы с ним.

Поскольку вы создаете новый запрос, неизвестный internal appengine package, это паникует.

Этот пакет также предоставляет функцию RegisterTestRequest, но это не упоминается в основной документации, поэтому YMMV. У меня нет опыта в этом.

+0

спасибо, но я вижу примечание в документе, в котором говорится: «Он должен использоваться только пакетом aetest». Я считаю, что это не риск. Есть ли другое решение? – srini

+0

Зачем вам нужно сначала называть 'NewContext'? Возможно, лучший подход состоял бы в том, чтобы полностью отделить приложения от определенных частей логики и сделать проверяемую логику приложения независимой от специфического состояния appengine? – nothingmuch

+0

Контекст необходим для операций с хранилищем appengine, таких как put, get, поэтому это необходимо в моем случае. – srini