【发布时间】:2018-12-21 18:26:58
【问题描述】:
我有这个功能,我需要在测试中模拟,
我能够使用 http 模拟包按预期模拟它,但现在我有正在调用的函数
到HttpReq 方法,这里我不能使用http mock 包
我阅读了依赖注入并尝试了一些方法,但我无法完全做到,
这是函数
type params struct {
cs string
ci string
method string
url string
}
// I added this struct but not sure if it's needed ... probably for test purpose but not sure how to use it.
type Impl struct {
client *http.Client
}
func (i *Impl) HttpReq(p *params) ([]byte, error) {
httpClient := i.client
req, err := http.NewRequest(p.method, p.url, nil)
if err != nil {
fmt.Sprintf(err)
}
req.SetBasicAuth(p.cs, p.ci)
res, err := httpClient.Do(req)
if err != nil {
fmt.Sprintf(err)
}
t, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Sprintf(err)
}
defer res.Body.Close()
return t, nil
}
这是我尝试过的
我已经创建了界面
type Req interface {
HttpReq(params) ([]byte, error)
}
现在我创建了一个包含接口的结构体
type Service struct {
req Req
}
这是我需要测试的功能
func (c *Service) execute(cli Connection , args []string) (error, []byte) {
sk, err := c.doSomthing(cli, args)
sc, err := c.doSometing2(serviceK, []string{"url", "cl", "ct"})
cc := strings.Fields(serviceCredentials)
// ----------Here is what I need to mock ----------
t, err := c.req.HttpReq(params{cs: cc[1],
ci: cc[2],
method: http.MethodPost,
url: cc[0],})
return err, t
}
知道如何为这个函数运行测试吗???我为此苦苦挣扎。
【问题讨论】:
-
旁白:不要为每个请求创建一个新的客户端:“客户端的传输通常具有内部状态(缓存的 TCP 连接),因此客户端应该被重用而不是根据需要创建。” golang.org/pkg/net/http/#Client
-
@Peter - 你建议把 is as global ?
-
我建议你注入客户端。然后,您可以轻松地继续使用 httptest 包中的服务器。
-
@Peter - 但如果我注入它,调用者会一次又一次地创建它,不是吗?