我正在编写一个需要将*gorequest.SuperAgent
的实例传递给子包中的方法的包
// main.go
func main() {
req := gorequest.New()
result := subpackage.Method(req)
fmt.Println(result)
}
// subpackage.go
func Method(req *gorequest.SuperAgent) string {
req.Get("http://www.foo.com").Set("bar", "baz")
_, body, _ := req.End()
return body
}
我一直在试图为gorequest superagent编写一个接口,所以我可以使用gorequest
的存根正确地隔离和测试我的子包方法。
type Getter Interface {
Get(url string) Getter
// In the previous Method, Get() returns a *gorequest.SuperAgent
// which allows chaining of methods
// Here I tried returning the interface itself
// But I get a 'wrong type for Get method' error when passing a gorequest instance
// have Get(string) *gorequest.SuperAgent
// want Get(string) Getter
End(callback ...func(response *gorequest.Response, body string, errs []error)) (*gorequest.Response, string, []error)
// I have no idea how to handle the param and returned *gorequest.Response here
// Put another interface ?
// Tried replacing it with *http.Response but not quite understanding it
}
func Method(req Getter) string {
...
}
所以你可以看到我在这里绊倒了几个点并且找不到好的资源来学习。任何指针都将非常感激
答案 0 :(得分:1)
除了定义Getter
接口之外,您还可以在*gorequest.SuperAgent
周围定义一个实现Getter
接口的瘦包装。
type saGetter struct {
sa *gorequest.SuperAgent
}
func (g *saGetter) Get(url string) Getter {
g.sa = g.sa.Get(url)
return g
}
func (g *saGetter) Set(param string, value string) Getter {
g.sa = g.sa.Set(param, value)
return g
}
func (g *saGetter) End(callback ...func(response *gorequest.Response, body string, errs []error)) (*gorequest.Response, string, []error) {
return g.sa.End(callback...)
}
然后将Method
定义为:
// subpackage.go
func Method(req Getter) string {
req.Get("http://www.foo.com").Set("bar", "baz")
_, body, _ := req.End()
return body
}
您可以像使用主要内容saGetter
一样使用:
// main.go
func main() {
req := gorequest.New()
result := subpackage.Method(&saGetter{req})
fmt.Println(result)
}
然后模拟Getter
来测试Method
实现很容易。
那就是说,我同意@ JimB的评论,你可能不需要gorequest
,使用net/http
通常是更好的选择。