http.Client をモックするためにこの投稿を見て使用しましたが、モック リクエストを渡そうとすると、次のエラーが表示されます。mockClient (タイプ *MockClient の変数) を *"net/http".Client として使用できません。 api.callAPI への引数の値。
1 つのファイルには、実際のコードがあります。
HTTPClient を作成しました。
type HTTPClient interface {
Do(req *http.Request) (*http.Response, error)
}
HTTPClient をインターフェイスとして渡す関数があります (仕事用なのですべてを表示することはできませんが、ここに重要な部分があります)。
func (api *API) callAPI(req *http.Request, client HTTPClient) (utils.ErrorWrapper, bool) {
response, err := client.Do(req)
}
callAPI メソッドを呼び出す別の関数もあります。その関数では、callAPI 関数を呼び出す直前にクライアント変数を作成します
var Client HTTPClient = &http.Client{}
response, isRetry := api.callAPI(req, Client)
これはすべてうまくいきます。ただし、私のテストファイルでは、上記のエラーが発生します。私はモックフレームワークにtestifyを使用しています。これが私のテストファイルにあるものです(テストファイルと実際のコードの両方が同じパッケージに含まれています):
testify を使用してモック クライアントと Do 関数をセットアップする
type MockClient struct {
mock.Mock
}
func (m *MockClient) Do(req *http.Request) (*http.Response, error) {
args := m.Called()
resp := args.Get(0)
return resp.(*http.Response), args.Error(1)
}
次に、テストを作成します。
func TestCallAPI(t *testing.T) {
mockClient := &MockClient{}
recorder := httptest.NewRecorder()
responseCh := make(chan utils.ErrorWrapper)
c, _ := gin.CreateTestContext(recorder)
id:= "unitTest123"
api := NewAPICaller(responseCh, id, c)
var response = Response{
StatusCode: 200,
}
//setup expectations
mockClient.On("Do").Return(response, nil)
req, _ := http.NewRequest("GET", "URL I Can't Show", nil)
wrapper, isRetry := api.callAPI(req, mockClient)
mockClient.AssertExpectations(t)
assert.Equal(t, "placeholder", wrapper)
assert.Equal(t, false, isRetry)
}
Client 変数で行ったのと同じように、mockclient 変数で同様のことを試みました。
var mockclient HTTPClient = &MockClient{}
しかし、HTTPClient でこのエラーが発生します: undeclared name: HTTPClient. それらは同じパッケージの一部であるため、なぜこれが起こっているのかわからないので、簡単にエクスポートできると思いましたか?