gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:58:21 28 4
gpt4 key购买 nike

我有以下代码:

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

server := httptest.NewServer(http.HandlerFunc(handler))
defer server.Close()

resp, err := http.Get(server.URL)
if err != nil {
t.Fatalf("Get: %v", err)
}
checkBody(t, resp, twitterResponse)
}

func checkBody(t *testing.T, r *http.Response, body string) {
b, err := ioutil.ReadAll(r.Body)
if err != nil {
t.Error("reading reponse body: %v, want %q", err, body)
}
if g, w := string(b), body; g != w {
t.Errorf("request body mismatch: got %q, want %q", g, w)
}
}

最佳答案

httptest 进行两种类型的测试:响应和服务器

react 测试:

func TestHeader3D(t *testing.T) {
resp := httptest.NewRecorder()

uri := "/3D/header/?"
path := "/home/test"
unlno := "997225821"

param := make(url.Values)
param["param1"] = []string{path}
param["param2"] = []string{unlno}

req, err := http.NewRequest("GET", uri+param.Encode(), nil)
if err != nil {
t.Fatal(err)
}

http.DefaultServeMux.ServeHTTP(resp, req)
if p, err := ioutil.ReadAll(resp.Body); err != nil {
t.Fail()
} else {
if strings.Contains(string(p), "Error") {
t.Errorf("header response shouldn't return error: %s", p)
} else if !strings.Contains(string(p), `expected result`) {
t.Errorf("header response doen't match:\n%s", p)
}
}
}

服务器测试(这是你需要使用的):

func TestIt(t *testing.T){
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
fmt.Fprintln(w, `{"fake twitter json string"}`)
}))
defer ts.Close()

twitterUrl = ts.URL
c := make(chan *twitterResult)
go retrieveTweets(c)

tweet := <-c
if tweet != expected1 {
t.Fail()
}
tweet = <-c
if tweet != expected2 {
t.Fail()
}
}

顺便说一句,你不需要传入 r 的指针,因为它已经是一个指针。

err = json.Unmarshal(body, r)

编辑:对于我的记录器测试,我可以像这样使用我的 http 处理程序:

handler(resp, req)

但是我的原始代码没有使用默认的多路复用器(而是来自 Gorilla/mux),并且我对多路复用器进行了一些包装,例如插入服务器日志,并添加请求上下文(Gorilla/context),所以我必须从 mux 开始并调用 ServeHTTP

关于http - 如何使用 httptest 在 Go 中测试 http 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16154999/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com