1 回答
TA贡献1775条经验 获得超11个赞
为了不让测试过于复杂,我建议您采用这种方法。首先,首先定义您的错误:
type timeoutError struct {
err string
timeout bool
}
func (e *timeoutError) Error() string {
return e.err
}
func (e *timeoutError) Timeout() bool {
return e.timeout
}
这样,timeoutError同时实现了Error()和Timeout接口。
然后你必须为 HTTP 客户端定义模拟:
type mockClient struct{}
func (m *mockClient) Do(req *http.Request) (*http.Response, error) {
return nil, &timeoutError{
err: "context deadline exceeded (Client.Timeout exceeded while awaiting headers)",
timeout: true,
}
}
这只是返回上面定义的错误并nil作为 http.Response。最后,让我们看看如何编写示例单元测试:
func TestSlowServer(t *testing.T) {
r := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
client := &mockClient{}
_, err := client.Do(r)
fmt.Println(err.Error())
}
如果您调试此测试并在变量上使用调试器暂停err,您将看到想要的结果。
由于这种方法,您可以在不增加任何额外复杂性的情况下实现所需的功能。让我知道是否适合你!
- 1 回答
- 0 关注
- 103 浏览
添加回答
举报