【问题标题】:How to test to make sure a function get called?如何测试以确保调用函数?
【发布时间】:2018-12-15 08:43:17
【问题描述】:

我想做单元测试。为了简单起见,我只想确保调用“JWTCheck”。我该怎么做?

这是我实现 JWTCheck 的文件:

type JWTChecker struct {
    SubjectPrefix string   
}

func (j *JWTChecker) JWTCheck(next http.Handler) http.Handler {
    // Do something
}

这就是我实现路由器的地方:

import (
    "net/http"
    "github.com/gorilla/mux"

    )

// Router returns a preconfigured router for application
func (a *Adapter) Router() http.Handler {
    router := mux.NewRouter()

    jwtChecker := JWTChecker{
        SubjectPrefix: "myappName",
    }

    /* Setup Loans Routes */
    loanrouter := router.PathPrefix("/lending/loans").Subrouter()
    if !a.Debug {
        loanrouter.Use(jwtChecker.JWTCheck)
    }
    loanrouter.HandleFunc("/customer/{customerid}/loan/{loanid}", a.GetLoan).Methods("GET")

    return router
}

【问题讨论】:

    标签: unit-testing go gorilla


    【解决方案1】:

    您必须使用net/http/httptest 编写单元测试用例,并且测试用例的函数名称将Test 作为您要测试的函数名称的前缀。文件名也将以yourfilename_test.go开头

    func Test<YourFuncName>(t *testing.T) {
    
        req, err := http.NewRequest("GET", "<your function url>", nil)
    
        if err != nil {
            panic(err.Error())
        }
    
        w := httptest.NewRecorder()
    
        handler.ServeHTTP(w, req)
    
        if w.Code != http.StatusOK {
            t.Errorf("Request failed, got: %d, expected: %d.", w.Code, http.StatusOK)
        }
    }
    

    【讨论】:

    • 您不必必须,但这是内置单元测试套件的工作流程和用于测试 http 处理程序的 stdlib 方法。这并不意味着没有其他方法可以做到。
    【解决方案2】:

    按照@saddam 的建议编写您的测试代码。

    然后使用go test 中的覆盖支持运行测试并验证JWTCheck 是否被覆盖。

    go test -coverprofile=.coverage.out && go tool cover -html=.coverage.out
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2013-03-21
      • 2021-06-01
      • 2018-11-15
      相关资源
      最近更新 更多