Я пытаюсь написать модульный тест с использованием gotests и gomock для моей спокойной службы, написанной на golang с использованием gorilla, но служба не может получить переменные из URL-адреса
Вот моя просьба
req, err := http.NewRequest("GET", "product/5b5758f9931653c36bcaf0a0", nil)
фактическая конечная точка - product/{id}
когда я вхожу в свою службу по приведенному ниже коду
params := mux.Vars(req)
Карта params
пуста, тогда как ее ключ id
должен быть сопоставлен с 5b5758f9931653c36bcaf0a0
Странная часть - конечная точка работает нормально от почтальона.
Могу я узнать, что не так с запросом?
Я бы записал URL-адрес запроса и проанализировал его с помощью url.ParseRequestURI, чтобы получить некоторую информацию.
зарегистрируйте ошибку, которую вы получаете при создании нового запроса
Поскольку вы используете запросы GET, вы можете использовать функцию http.Get, она работает должным образом:
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func handle(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
fmt.Println(params)
}
func main() {
m := mux.NewRouter()
m.HandleFunc("/products/{id}", handle)
http.Handle("/", m)
go func() {
http.ListenAndServe(":8080", nil)
}()
_, err := http.Get("http://localhost:8080/products/765")
// Handle Error
}
Если вы действительно хотите использовать http.NewRequest, эта функция на самом деле не выполняет запрос, поэтому вот что вам понадобится:
req, err := http.NewRequest("GET", "product/5b5758f9931653c36bcaf0a0", nil)
client := &http.Client{}
client.Do(req)
Это решило проблему
req = mux.SetURLVars(req, map[string]string{"id": "5b5758f9931653c36bcaf0a0"})
Это не выход.
Создайте мультиплексорный маршрутизатор в отдельной функции в исходном коде и вызовите ее непосредственно в своем тесте.
В исходном коде:
func Router() *mux.Router {
r := mux.NewRouter()
r.HandleFunc("/product/{id}", productHandler)
return r
}
func main() {
http.Handle("/", Router())
}
В тесте:
func TestProductHandler(t *testing.T) {
r := http.NewRequest("GET", "product/5b5758f9931653c36bcaf0a0", nil)
w := httptest.NewRecorder()
Router().ServeHTTP(w, r)
}
Нашел соответствующее решение на одном из форумов групп Google. https://groups.google.com/forum/#!msg/golang-nuts/Xs-Ho1feGyg/xg5amXHsM_oJ
да, это был правильный ответ. Спасибо!
Как выглядит
HandleFunce
?