为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这个咕噜咕咕HTTP响应程序返回错误的调用次数?

为什么这个咕噜咕咕HTTP响应程序返回错误的调用次数?

Go
一只斗牛犬 2022-09-26 17:33:45
我正在为我的 Go 应用程序编写测试用例,以发出 HTTP 请求。为了模拟来自远程主机的响应,我创建了此类字符串转换器type stringProducer struct {    strings   []string    callCount int}func (s *stringProducer) GetNext() string {    if s.callCount >= len(s.strings) {        panic("ran out of responses")    }    s.callCount++    fmt.Println("s.CallCount = ", s.callCount)    return s.strings[s.callCount-1]}func mockHTTPResponder(producer stringProducer) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        w.WriteHeader(http.StatusOK)        w.Write([]byte(producer.GetNext()))    })}以下是我在主函数中调用它的方式:func main() {    producer := stringProducer{        strings: []string{"Hello World!"},    }    srv := httptest.NewServer(mockHTTPResponder(producer))    if producer.callCount != 0 {        panic("callCount is not 0")    }    var buf io.ReadWriter    req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, fmt.Sprintf("%s/path/to/something", srv.URL), buf)    newClient := http.Client{}    newClient.Do(req)    if producer.callCount != 1 {        panic("callCount is not 1")    }}在此代码中,当发出HTTP请求时,它会转到上面的响应者,该响应程序使用一些预先指定的文本进行响应。它还会导致计数器递增 1。stringProducer.callCount从下面的程序输出中,您可以看到它打印了一行,显示 callCount 已递增到 1。但是,当我检查相同的值时,它不是1。它是零。为什么?如何解决这个问题?s.CallCount =  1panic: callCount is not 1goroutine 1 [running]:main.main()    /tmp/sandbox3935766212/prog.go:50 +0x118去游乐场链接在这里: https://play.golang.org/p/mkiJAfrMdCw
查看完整描述

1 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

在模拟HTTPResponder中传递值字符串。当您执行此操作时,您将获得模拟HTTP响应器中变量的副本。并且对该副本进行了以下所有更改(原始字符串制作器保持不变):


func mockHTTPResponder(producer stringProducer) http.Handler { // <- producer is a copy of the original variable

    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        w.WriteHeader(http.StatusOK)

        w.Write([]byte(producer.GetNext()))  // <- s.callCount++ on the copy

    })

}

在模拟HTTP响应器中传递指针。


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信