Использование двух разных макетов в модульном тесте Go - PullRequest
0 голосов
/ 23 апреля 2019

Я учусь проводить модульное тестирование, используя 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),
    }
}

Есть ли проблема с назначением одного и того же контроллера для двух разных объектов? Не совсем уверен, что здесь происходит. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 апреля 2019

Я решил это, как предложил Адриан в комментариях выше. Мне не хватало способа передать фиктивный клиент в NewService, и в итоге я добавил параметр клиента в NewService.

...