猿问

如何使用 httptest 在 Go 中测试 http 调用

我有以下代码:


package main


import (

    "encoding/json"

    "fmt"

    "io/ioutil"

    "log"

    "net/http"

    "time"

)


type twitterResult struct {

    Results []struct {

        Text     string `json:"text"`

        Ids      string `json:"id_str"`

        Name     string `json:"from_user_name"`

        Username string `json:"from_user"`

        UserId   string `json:"from_user_id_str"`

    }

}


var (

  twitterUrl = "http://search.twitter.com/search.json?q=%23UCL"

  pauseDuration = 5 * time.Second

)


func retrieveTweets(c chan<- *twitterResult) {

    for {

        resp, err := http.Get(twitterUrl)

        if err != nil {

            log.Fatal(err)

        }


        defer resp.Body.Close()

        body, err := ioutil.ReadAll(resp.Body)

        r := new(twitterResult) //or &twitterResult{} which returns *twitterResult

        err = json.Unmarshal(body, &r)

        if err != nil {

            log.Fatal(err)

        }

        c <- r

        time.Sleep(pauseDuration)

    }


}


func displayTweets(c chan *twitterResult) {

    tweets := <-c

    for _, v := range tweets.Results {

        fmt.Printf("%v:%v\n", v.Username, v.Text)

    }


}


func main() {

    c := make(chan *twitterResult)

    go retrieveTweets(c)

    for {

        displayTweets(c)

    }


}

我想为它编写一些测试,但我不确定如何使用 httptest 包http://golang.org/pkg/net/http/httptest/希望得到一些指点


我想出了这个(无耻地从 go OAuth https://code.google.com/p/goauth2/source/browse/oauth/oauth_test.go的测试中复制):


var request = struct {

    path, query       string // request

    contenttype, body string // response

}{

    path:        "/search.json?",

    query:       "q=%23Kenya",

    contenttype: "application/json",

    body:        twitterResponse,

}


var (

    twitterResponse = `{ 'results': [{'text':'hello','id_str':'34455w4','from_user_name':'bob','from_user_id_str':'345424'}]}`

)


func TestRetrieveTweets(t *testing.T) {

    handler := func(w http.ResponseWriter, r *http.Request) {


        w.Header().Set("Content-Type", request.contenttype)

        io.WriteString(w, request.body)

    }




哔哔one
浏览 319回答 3
3回答

回首忆惘然

最初这个代码片段是在 GitHub Gist 上找到的,但是在尝试将这个概念应用于我的一个项目时,我意识到我必须显着修改主要代码,我决定使用 docker 和 curl 使用集成测试来测试这些调用。
随时随地看视频慕课网APP

相关分类

Go
我要回答