我在為我正在匯入的這個第 3 方庫撰寫測驗時遇到了困難。我認為這是因為我希望我的CustomClient結構有一個client介面而不是*banker.Client. 這使得測驗變得非常困難,因為很難模擬*banker.Client. 有什么想法可以正確地將其轉換為界面嗎?所以我可以輕松地針對它撰寫模擬測驗并設定一個假客戶端?
type CustomClient struct {
client *banker.Client //I want to change this to an interface
name string
address string
}
func (c *CustomClient) SetHttpClient(httpClient *banker.Client) { //I want to accept an interface so I can easily mock this.
c.client = httpClient
}
問題是 banker.Client 是我正在匯入的第三方客戶端,其中包含許多結構和其他欄位。它看起來像這樣:
type Client struct {
*restclient.Client
Monitor *Monitors
Pricing *Pricing
Verifications *Verifications
}
最終結果是我的代碼如下所示:
func (c *CustomClient) RequestMoney() {
_, err := v.client.Verifications.GetMoney("fakeIDhere")
}
uj5u.com熱心網友回復:
給定結構上欄位的方法,它肯定不是一個簡單的解決方案。但是,我們可以盡量減少當前包上冗長的測驗用例。
在您的作業包和銀行家之間添加另一層(包)。簡化例子中的代碼來解釋。
假設您的banker包具有以下代碼:
type Client struct {
Verification *Verification
}
type Verification struct{}
func (v Verification) GetMoney(s string) (int, error) {
...
}
創建另一個匯入銀行家并定義介面的包,例如bankops包:
type Bank struct {
BankClient *banker.Client
}
type Manager interface {
GetMoney(s string) (int, error)
}
func (b *Bank) GetMoney(s string) (int, error) {
return b.BankClient.Verification.GetMoney(s)
}
注意:實際問題(無介面測驗)仍在 bankops 包中,但這更容易測驗,因為我們只是轉發結果。服務于單元測驗的目的。
最后,在當前的包中(對我來說就是main包),我們可以
type CustomClient struct {
client bankops.Manager
}
func (c *CustomClient) RequestMoney() {
_, err := c.client.GetMoney("fakeIDhere")
...
}
func main() {
client := &CustomClient{
client: &bankops.Bank{
BankClient: &banker.Client{
Verification: &banker.Verification{},
},
},
}
client.RequestMoney()
}
例如,簽入Playground。
您可以在原始代碼片段中添加setters或,以使欄位(如)不匯出。builders patternBankerClient
uj5u.com熱心網友回復:
我認為直接把它做成介面是不可能的,因為我們應該使用Client.
把它的成員變成介面怎么樣?例如,
for _, test := []struct{}{
testVerification VerificationInterface
}{{
testVerification: v.Client.Verifications
},{
testVerification: VerficationMock
}}{
// test code here
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/529530.html
標籤:http去
