2015-08-08 82 views
1

我一直在寻找答案,但找不到它。我的问题是,是否有可能测试依赖动态URL标记的处理函数?测试处理器依靠Go中的动态URL的功能

例如,可以说我的处理程序函数需要动态生成的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 

} 

可能以某种方式进行单元测试这个处理函数没有获得如何创建令牌?

回答

2

可以填充一个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. 
} 
0

我能想到的最简单的事情就是创建一个帮助函数,它将所有参数作为处理函数,并将该函数作为参数。然后你可以单元测试那个函数。因此,像:

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) { 
    ... 
}