Sobes.tech
Назад к вопросам
Junior
26

Как работал с тестированием в Go? Работал ли с моками?

Компании, где спрашивали
Позитив Технолоджис

Ответ от нейросети

sobes.tech AI

В Go для тестирования обычно используется стандартный пакет testing. Тесты пишутся в файлах с суффиксом _test.go и запускаются командой go test.

Для мокирования зависимостей можно использовать интерфейсы и создавать собственные реализации для тестов. Также популярны сторонние библиотеки, например, gomock или testify/mock.

Пример простого теста с мок-объектом:

package service

import (
    "testing"
)

type UserRepository interface {
    GetUser(id int) (User, error)
}

type User struct {
    ID int
    Name string
}

type UserService struct {
    repo UserRepository
}

func (s *UserService) GetUserName(id int) (string, error) {
    user, err := s.repo.GetUser(id)
    if err != nil {
        return "", err
    }
    return user.Name, nil
}

// Мок реализации UserRepository

type MockUserRepo struct{}

func (m *MockUserRepo) GetUser(id int) (User, error) {
    return User{ID: id, Name: "Test User"}, nil
}

func TestGetUserName(t *testing.T) {
    mockRepo := &MockUserRepo{}
    service := UserService{repo: mockRepo}

    name, err := service.GetUserName(1)
    if err != nil {
        t.Fatal(err)
    }
    if name != "Test User" {
        t.Errorf("expected 'Test User', got %s", name)
    }
}

Такой подход позволяет изолировать тестируемый код от реальных зависимостей.