Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kerangka kerja Golang masalah dan penyelesaian biasa

Kerangka kerja Golang masalah dan penyelesaian biasa

PHPz
PHPzasal
2024-06-03 18:38:02508semak imbas

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.

Kerangka kerja Golang masalah dan penyelesaian biasa

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:

  • Gunakan 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 请求至关重要。为此,可以使用 contexthttp.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 中获取当前登录用户的信息非常重要。可以通过 contextjwtBuat model dalam pakej model.

Buat kebergantungan dalam pakej 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
}
rrreee

🎜Soalan 2: Cara mensimulasikan permintaan HTTP dalam ujian unit 🎜🎜🎜 adalah penting untuk pengawal ujian mengendalikan permintaan HTTP. Untuk tujuan ini, gunakan 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn