繁体   English   中英

依赖Go中动态URL的测试处理程序功能

[英]Testing Handler Function that relies on a dynamic URL in Go

我一直在寻找答案,但找不到。 我的问题是,是否有可能测试依赖于动态URL令牌的处理函数?

例如,假设我的处理程序函数需要动态生成的URL中的令牌(我不知道该令牌是如何生成的,除了URL参数之外,我无法访问它)。 我的网址总是像这样:www.example.com/?token=randomtokenhere

func TokenProcessing(w http.ResponseWriter, r *http.Request) {
     token := r.URL.Query().Get("token") // dynamically generated from parsed URL 

      // code to do something with said token

}

是否可以通过某种方式对此处理程序功能进行单元测试,而无需访问令牌的创建方式?

您可以填充的查询参数http.Request ,然后用测试处理器httptest.ResponseRecorder

例如

package main

import (
    "log"
    "net/http"
    "net/http/httptest"
    "testing"
)

// In this test file to keep the SO example concise
func TokenProcessing(w http.ResponseWriter, r *http.Request) {
    token := r.URL.Query().Get("token") // dynamically generated from parsed URL
    // code to do something with said token
    log.Println(token)
}

func TestTokenProcessing(t *testing.T) {
    rr := httptest.NewRecorder()
    r, err := http.NewRequest("GET", "http://golang.org/", nil)
    if err != nil {
        t.Fatal(err)
    }

    // Generate suitable values here - e.g. call your generateToken() func
    r.URL.Query().Add("token", "someval")

    handler := http.HandlerFunc(TokenProcessing)
    handler.ServeHTTP(rr, r)

    if code := rr.Code; code != http.StatusOK {
        t.Fatalf("handler did not return correct status: want %v got %v",
            http.StatusOK, code)
    }

    // Test the rest of the response - i.e. sets a header, etc.
}

我想到的最简单的方法是创建一个辅助函数,该函数将所有参数用作处理程序,并另外将标记作为参数。 然后,您可以对该功能进行单元测试。 所以像这样:

func TokenProcessing(w http.ResponseWriter, r *http.Request) {
    token := r.URL.Query().Get("token")
    tokenProcessingHelper(w, r, token)
}

// unit test me!
func tokenProcessingHelper(w http.ResponseWriter, r *http.Request, token string) {
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM