Loading...
Loading...
Compare original and translation side by side
*_test.gomocks/*_test.gomocks//cmd/internal/pkggo mod init/cmd/internal/pkggo mod initgithub.com/stretchr/testify/requiregithub.com/stretchr/testify/requiremocks/mocks/anyinterface{}anyinterface{}anyinterface{}anyinterface{}project-root/
├── cmd/ # Main applications
│ └── myapp/
│ └── main.go
├── internal/ # Private application code
│ ├── handler/ # HTTP handlers
│ │ ├── handler.go
│ │ ├── handler_test.go
│ │ └── mocks/ # Mocks for handler interfaces
│ ├── service/ # Business logic
│ │ ├── service.go
│ │ ├── service_test.go
│ │ └── mocks/
│ └── repository/ # Data access
│ ├── repository.go
│ ├── repository_test.go
│ └── mocks/
├── pkg/ # Public library code
│ └── client/
│ ├── client.go
│ ├── client_test.go
│ └── mocks/
├── api/ # API definitions (OpenAPI, protobuf)
├── configs/ # Configuration files
├── go.mod
├── go.sum
└── README.mdproject-root/
├── cmd/ # 主应用程序
│ └── myapp/
│ └── main.go
├── internal/ # 私有应用代码
│ ├── handler/ # HTTP处理器
│ │ ├── handler.go
│ │ ├── handler_test.go
│ │ └── mocks/ # 处理器接口的模拟对象
│ ├── service/ # 业务逻辑
│ │ ├── service.go
│ │ ├── service_test.go
│ │ └── mocks/
│ └── repository/ # 数据访问
│ ├── repository.go
│ ├── repository_test.go
│ └── mocks/
├── pkg/ # 公共库代码
│ └── client/
│ ├── client.go
│ ├── client_test.go
│ └── mocks/
├── api/ # API定义(OpenAPI, protobuf)
├── configs/ # 配置文件
├── go.mod
├── go.sum
└── README.md// Unit test with mock
func TestServiceCreate(t *testing.T) {
mockRepo := mocks.NewRepository(t)
mockRepo.On("Save", mock.Anything).Return(nil)
svc := NewService(mockRepo)
err := svc.Create(context.Background(), data)
require.NoError(t, err)
mockRepo.AssertExpectations(t)
}
// Separate negative test
func TestServiceCreate_RepoError(t *testing.T) {
mockRepo := mocks.NewRepository(t)
mockRepo.On("Save", mock.Anything).Return(errors.New("db error"))
svc := NewService(mockRepo)
err := svc.Create(context.Background(), data)
require.Error(t, err)
require.Contains(t, err.Error(), "db error")
}// 带模拟对象的单元测试
func TestServiceCreate(t *testing.T) {
mockRepo := mocks.NewRepository(t)
mockRepo.On("Save", mock.Anything).Return(nil)
svc := NewService(mockRepo)
err := svc.Create(context.Background(), data)
require.NoError(t, err)
mockRepo.AssertExpectations(t)
}
// 独立的负向测试
func TestServiceCreate_RepoError(t *testing.T) {
mockRepo := mocks.NewRepository(t)
mockRepo.On("Save", mock.Anything).Return(errors.New("db error"))
svc := NewService(mockRepo)
err := svc.Create(context.Background(), data)
require.Error(t, err)
require.Contains(t, err.Error(), "db error")
}handlerserviceuser_service.gouser_service_test.goUserServiceHTTPHandler-erReaderWriterUserRepositoryhandlerserviceuser_service.gouser_service_test.goUserServiceHTTPHandlerReaderWriterUserRepository| If You Need To... | See This Resource |
|---|---|
| Set up a new Go project structure | Project Structure |
| Understand Go naming conventions | Naming Conventions |
| Write tests with TDD, testify/require, and mockery | Testing Guide |
| Organize packages, interfaces, and dependencies | Code Organization |
| Handle errors idiomatically | Error Handling |
| Work with goroutines, channels, and context | Concurrency Patterns |
| Manage dependencies and go.mod | Dependencies |
| See complete working examples | Complete Examples |
| 当你需要... | 请查看此资源 |
|---|---|
| 搭建新Go项目结构 | 项目结构 |
| 了解Go命名规范 | 命名规范 |
| 使用TDD、testify/require和mockery编写测试 | 测试指南 |
| 组织包、接口和依赖 | 代码组织 |
| 地道的错误处理 | 错误处理 |
| 使用goroutine、channel和context | 并发模式 |
| 管理依赖和go.mod | 依赖管理 |
| 查看完整示例 | 完整示例 |
references/references/