Я учусь проводить модульное тестирование, используя mocks в Go, используя утилиту gomock's mockgen. Мои юнит-тесты работают нормально, за исключением одного из них. У тестируемого метода есть две зависимости: одна от базы данных, а другая от внешней службы, для которой он делает остальные API-вызовы. Макет для базы данных (mockRepo) отлично работает, так как тестируемый метод правильно вызывает макет вместо реального кода репо. Однако макет клиента отдыха продолжает вызывать фактический клиент отдыха, а не код макета. Я не могу понять, почему. Может кто-нибудь объяснить, почему и помочь исправить?
Вот мой модульный тест:
func TestService_CreateWorkspace(t *testing.T) {
ts := NewTestService(t)
defer ts.mockCtrl.Finish()
ts.mockClient.EXPECT().POST(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(&http.Response{StatusCode: 200}, nil)
testWs := TestWorkspaces()["max-ws"]
ts.mockRepo.EXPECT().Create(testWs).Times(1).Return(&testWs, nil)
ws, err := ts.service.CreateWorkspace(&testWs)
assert.Equal(t, testWs, ws)
assert.NoError(t, err)
}
Вот код для NewTestService:
type TestService struct {
mockCtrl *gomock.Controller
mockClient *MockRestClient
mockRepo *MockRepository
service Service
}
func NewTestService(t *testing.T) *TestService {
mockCtrl := gomock.NewController(t)
mockRepo := NewMockRepository(mockCtrl)
mockClient := NewMockRestClient(mockCtrl)
return &TestService{
mockCtrl: mockCtrl,
mockClient: mockClient,
mockRepo: mockRepo,
service: NewService(mockRepo),
}
}
Есть ли проблема с назначением одного и того же контроллера для двух разных объектов? Не совсем уверен, что здесь происходит. Любая помощь приветствуется.