ΠΠΎΠΊΠΈ (mocks) β ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠΈΡΠΈΡΡΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΡΠ΅ΡΡΠ°Ρ . ΠΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΎΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Π²Π½Π΅ΡΠ½ΠΈΠ΅ API, ΡΠ°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ. ΠΠΎΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΡΡΡΡ Π½Π° ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΊΠΎΠ΄Π° Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΠΌΠΈ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌΠΈ.
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΡ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ
gomock
ΠΈΠ»ΠΈ testify/mock
. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ testify/mock
.Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ testify
go get github.com/stretchr/testify
// api.go
package main
type APIClient interface {
FetchData(endpoint string) (string, error)
}
func GetData(client APIClient, endpoint string) (string, error) {
data, err := client.FetchData(endpoint)
if err != nil {
return "", err
}
return data, nil
}
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΌΠΎΠΊ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°
APIClient
Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ testify/mock
.// api_test.go
package main
import (
"errors"
"testing"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/assert"
)
// MockAPIClient is a mock type for the APIClient interface
type MockAPIClient struct {
mock.Mock
}
func (m *MockAPIClient) FetchData(endpoint string) (string, error) {
args := m.Called(endpoint)
return args.String(0), args.Error(1)
}
func TestGetData(t *testing.T) {
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΊΠ°
mockClient := new(MockAPIClient)
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΌΠΎΠΊΠ° Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° Π΄Π°Π½Π½ΡΡ
mockClient.On("FetchData", "test-endpoint").Return("mocked data", nil)
// ΠΡΠ·ΠΎΠ² ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
data, err := GetData(mockClient, "test-endpoint")
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ²
assert.NoError(t, err)
assert.Equal(t, "mocked data", data)
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²ΡΠ·ΠΎΠ²Π° ΠΌΠΎΠΊΠ°
mockClient.AssertExpectations(t)
}
func TestGetDataWithError(t *testing.T) {
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΊΠ°
mockClient := new(MockAPIClient)
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΌΠΎΠΊΠ° Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΎΡΠΈΠ±ΠΊΠΈ
mockClient.On("FetchData", "error-endpoint").Return("", errors.New("fetch error"))
// ΠΡΠ·ΠΎΠ² ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
data, err := GetData(mockClient, "error-endpoint")
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ²
assert.Error(t, err)
assert.Equal(t, "", data)
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²ΡΠ·ΠΎΠ²Π° ΠΌΠΎΠΊΠ°
mockClient.AssertExpectations(t)
}
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ