Masalah biasa dalam pembangunan rangka kerja Go termasuk ketidakupayaan untuk menyuntik kebergantungan, mensimulasikan permintaan HTTP dan mendapatkan ID pengguna. Artikel ini menyediakan penyelesaian: Suntikan kebergantungan: Gunakan gorm.Model untuk membenamkan model, cipta model dalam pakej model, buat kebergantungan dalam pakej apl dan gunakan suntikan wayar. Permintaan HTTP olok-olok: Menggunakan konteks dan http.Request, buat permintaan olok-olok dan uji pengawal yang mengendalikan permintaan itu. Dapatkan ID pengguna: Dapatkan maklumat pengguna yang sedang log masuk daripada permintaan HTTP melalui konteks dan jwt.
Go framework masalah dan penyelesaian biasa
Dalam pembangunan rangka kerja Go, anda akan menghadapi beberapa masalah biasa. Artikel ini akan memperkenalkan masalah ini dan penyelesaiannya, dan menyediakan kes praktikal.
Masalah 1: Tidak dapat menyuntik kebergantungan
Ini adalah salah satu masalah yang paling biasa apabila menggunakan rangka kerja Go. Untuk menyelesaikan masalah ini, anda boleh mengikuti langkah berikut:
gorm.Model
untuk membenamkan model. gorm.Model
嵌入模型。models
包中创建模型。app
包中创建依赖项。wire
注入依赖项。实战案例:
// models/user.go package models import "gorm.io/gorm" type User struct { gorm.Model Name string }
// app/dependencies.go package app import "github.com/google/wire" var UserRepoSet = wire.NewSet( wire.Struct(new(UserRepository), "*"), wire.Bind(new(UserRepository), new(IUserRepository)), )
问题 2:如何在单元测试中模拟 HTTP 请求
对于测试控制器处理 HTTP 请求至关重要。为此,可以使用 context
和 http.Request
。
实战案例:
func TestUserController_CreateUser(t *testing.T) { ctx := context.Background() body := strings.NewReader("{\"name\": \"test\"}") req := http.Request{Body: body} userRepo := &userRepositoryMock{ CreateFunc: func(*User) error { return nil }, } ctrl := NewUserController(userRepo) w := httptest.NewRecorder() ctrl.CreateUser(ctx, w, &req) assert.Equal(t, http.StatusCreated, w.Code) }
问题 3:如何在 HTTP 请求中获取用户 ID
在 API 中获取当前登录用户的信息非常重要。可以通过 context
和 jwt
Buat model dalam pakej model
.
app
. Gunakan wire
untuk menyuntik kebergantungan. Kes praktikal:
func GetUserFromContext(ctx context.Context) (int, error) { claims, ok := ctx.Value("claims").(jwt.MapClaims) if !ok { return 0, errors.New("error getting claims from context") } userID := claims["user_id"].(float64) return int(userID), nil }
context
dan http.Request
. 🎜🎜🎜Kes praktikal: 🎜🎜rrreee🎜🎜Soalan 3: Bagaimana untuk mendapatkan ID pengguna dalam permintaan HTTP🎜🎜🎜Adalah sangat penting untuk mendapatkan maklumat pengguna yang sedang log masuk dalam API. Ini boleh dicapai melalui konteks
dan jwt
. 🎜🎜🎜Contoh Praktikal: 🎜🎜rrreee🎜Dengan menyelesaikan masalah biasa ini, pembangun boleh membina aplikasi Go yang mantap dan boleh diuji. 🎜Atas ialah kandungan terperinci Kerangka kerja Golang masalah dan penyelesaian biasa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!