golang/mock のような追加のパッケージを使用せずに、関数をモックする方法を理解するのに完全に混乱しています。その方法を学ぼうとしていますが、適切なオンライン リソースがあまり見つかりません。
基本的に、インターフェイスを使用して物事をモックする方法を説明するこの優れた記事に従いました。
そのため、テストしたい関数を書き直しました。この関数は、データストアにデータを挿入するだけです。そのための私のテストは問題ありません-関数を直接モックできます。
私が抱えている問題は、テストしようとしている 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
}
しかし、それは他のすべてのテストなどに影響します。
データストアなどに頼らずにルートをテストできるように、 FindAndCompleteOperation 関数をモックする最良の方法を誰かが簡単に説明してくれることを願っています.