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