[英]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.