Я полностью смущен, выясняя, как я могу издеваться над функцией, не используя никаких дополнительных пакетов, таких как golang/mock. Я просто пытаюсь научиться этому, но не могу найти много достойных онлайн-ресурсов.Стыковка функций в Голанге для проверки моих маршрутов http
По существу, I followed this excellent article, в котором объясняется, как использовать интерфейс для издевательства над вещами.
Как я, я переписал функцию, которую я хотел протестировать. Функция просто вставляет некоторые данные в хранилище данных. Мои тесты для этого в порядке - я могу издеваться над функцией напрямую.
Проблема, с которой я сталкиваюсь, насмехается над «маршрутом http», который я пытаюсь проверить. Я использую структуру Gin.
Мой маршрутизатор (упрощенно) выглядит следующим образом:
func SetupRouter() *gin.Engine {
r := gin.Default()
r.Use(gin.Logger())
r.Use(gin.Recovery())
v1 := r.Group("v1")
v1.PATCH("operations/:id", controllers.UpdateOperation)
}
Что вызывает функцию UpdateOperation:
func UpdateOperation(c *gin.Context) {
id := c.Param("id")
r := m.Response{}
str := m.OperationInfoer{}
err := m.FindAndCompleteOperation(str, id, r.Report)
if err == nil {
c.JSON(200, gin.H{
"message": "Operation completed",
})
}
}
Итак, мне нужно издеваться функцию FindAndCompleteOperation().
Основные (упрощенный) функции выглядит следующим образом:
func (oi OperationInfoer) FindAndCompleteOp(id string, report Report) error {
ctx := context.Background()
q := datastore.NewQuery("Operation").
Filter("Unique_Id =", id).
Limit(1)
var ops []Operation
if ts, err := db.Datastore.GetAll(ctx, q, &ops); err == nil {
{
if len(ops) > 0 {
ops[0].Id = ts[0].ID()
ops[0].Complete = true
// Do stuff
_, err := db.Datastore.Put(ctx, key, &o)
if err == nil {
log.Print("OPERATION COMPLETED")
}
}
}
}
err := errors.New("Not found")
return err
}
func FindAndCompleteOperation(ri OperationInfoer, id string, report Report) error {
return ri.FindAndCompleteOp(id, report)
}
type OperationInfoer struct{}
Чтобы проверить маршрут, который обновляет операцию, у меня есть что-то вроде этого:
FIt("Return 200, updates operation", func() {
testRouter := SetupRouter()
param := make(url.Values)
param["access_token"] = []string{public_token}
report := m.Report{}
report.Success = true
report.Output = "my output"
jsonStr, _ := json.Marshal(report)
req, _ := http.NewRequest("PATCH", "/v1/operations/123?"+param.Encode(), bytes.NewBuffer(jsonStr))
resp := httptest.NewRecorder()
testRouter.ServeHTTP(resp, req)
Expect(resp.Code).To(Equal(200))
o := FakeResponse{}
json.NewDecoder(resp.Body).Decode(&o)
Expect(o.Message).To(Equal("Operation completed"))
})
Изначально я пытался обмануть немного и просто попробовал что-то вроде этого:
m.FindAndCompleteOperation = func(string, m.Report) error {
return nil
}
Но это a ffects все другие тесты и т.д.
Я надеюсь, что кто-то может просто объяснить, что лучший способ для имитации функции FindAndCompleteOperation, так что я могу проверить маршруты, не полагаясь на хранилищу и т.д.
У меня есть ответ к аналогичному вопросу здесь: http://stackoverflow.com/questions/19167970/mock-functions-in-go/19168875#19168875 Длинная история short: вам нужно ввести функцию FindAndCompleteOperation(), чтобы издеваться над ней. – weberc2
Вот еще один подход с полным примером, который должен прояснить, как можно написать тестовый код в Go: https://stackoverflow.com/a/48206430/828366 –
Возможный дубликат [Mock functions in Go] (https://stackoverflow.com/questions/19167970/mock-functions-in-go) –