我很難找出慣用的在golang中編寫可測試代碼的方法。我明白接口及其在測試中的重要性,但我還沒有弄清楚如何模擬/測試外部結構依賴關係。嘲笑golang中的外部結構依賴關係
作爲一個例子,我編寫了下面的代碼來模擬在GitHub上創建一個請求的包裝器。
type GitHubService interface {
}
type gitHubService struct {
CreatePullRequest(...) (PullRequest,error)
}
func (s gitHubService) CreatePullRequest(...) (PullRequest,error) {
tp := github.BasicAuthTransport{
Username: strings.TrimSpace(/*.....*/),
Password: strings.TrimSpace(/*.....*/),
}
client := github.NewClient(tp.Client())
pr,err := client.Repositories.CreatePullRequest(...)
...
}
func TestPullRequest(t *testing.T) {
service := gitHubService{}
pr,err := service.CreatePullRequest(...)
...
}
如果我在寫一個單元測試GitHubService.CreatePullRequest(...)
我想嘲笑調用client.Repositories.CreatePullRequest(...)
甚至可能github.NewClient(...)
返回,我可以控制mock實現。
使用諸如gomock
之類的工具,您似乎對結構和包函數感到失望。
處理這種情況的慣用方法是什麼?我非常習慣於控制反轉以及依賴注入和服務定位器等不同的模式,但我無數次聽說這不是慣用的。
單元測試應該測試CreatePullRequest的'邏輯'獨自一人,我對集成測試不感興趣。 – TheJediCowboy
我在說的是,這裏沒有顯示的邏輯來測試 - 一切都發生在github包內,它有自己的測試。如果你確實在'''後面隱藏了額外的邏輯,那麼將它們拆分成單獨的部分進行測試。 – JimB
@JimB如果我將'...'後面的邏輯分解爲自己的測試,我正在測試這些東西,但不是'CreatePullRequest(...)'中的邏輯。我仍然想要一個單元測試來測試這個代碼單元的邏輯流程。 – TheJediCowboy