我正在開發一個簡單的golang服務器應用程式,它可以進行OAuth認證。服務器代碼是直接的。對于單元測驗,我需要避免向實際的 OAuth 提供者發出外部 HTTP 請求。
因此,在正常的服務器操作中,我希望使用真正的呼叫,而在運行go test時,使用一個Mock方法來防止外部HTTP請求。
我已經創建了OAuth方法的模擬,但我并不了解如何將它們整合到代碼中的機制。通過查看模擬示例,我仍然對模擬介面的使用方式感到困惑。
這里是原始代碼:
type Server struct {
//This is the actual golang.org/x/oauth2 Config struct.
oauth2Config *oauth2.Config
}
func (s *Server) handleCallback() http. HandlerFunc {
//這是一個進行外部呼叫的方法。我想模擬它
oauth2Token, err := s.oauth2Config.Exchange(s.context, r.URL.Query().Get("code"/span>)
}
我定義了一個介面,以及模擬函式
type Oauth2ConfigInterface interface {
Exchange(ctx context.Context, code string, opts ...oauth2.AuthCodeOption) (*oauth2.Token, error)
}
type MockOauth2Config struct {
}
func (o *MockOauth2Config) Exchange(ctx context。 Context, code string, opts ...oauth2.AuthCodeOption) (*oauth2.Token, error) {
return &oauth2.Token{}, nil {
}
我認為我應該改變原來的服務器結構,以使用新的介面:
typeServer struct {
//Changed to interface[/span]。
oauth2Config Oauth2ConfigInterface
}
...
oauth2Config: &oauth2.Config{
ClientID: ""。
ClientSecret: ""。
重定向URL。 ""。
作用域。 []string{oidc.ScopeOpenID},
},
但是當我試圖訪問oauth2Config的欄位時,它給我帶來了編譯錯誤。
//compile error here
s.verifier = s.provider.Verifier(&oidc.Config{ClientID: s.oauth2Config.ClientID})
一旦 oauth2Config 被宣告為一個介面,我怎樣才能訪問這些欄位呢?
或者是我在整個模擬中做錯了嗎?
uj5u.com熱心網友回復:
回答我自己的問題......
我可能把我的問題表述得很糟糕,但我確實認為人們在未來會遇到同樣的問題。
@bcmills給出了最好的解決方案。 如何模擬 net.Interface
這比使用介面模擬要優雅得多。特別是對于像這樣涉及到第三方函式/方法的情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329384.html
標籤:
