Kerangka kerja Golang masalah dan penyelesaian biasa

PHPz
Lepaskan: 2024-06-03 18:38:02
asal
557 orang telah melayarinya

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
}
Salin selepas log masuk
// app/dependencies.go
package app

import "github.com/google/wire"

var UserRepoSet = wire.NewSet(
    wire.Struct(new(UserRepository), "*"),
    wire.Bind(new(UserRepository), new(IUserRepository)),
)
Salin selepas log masuk

问题 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)
}
Salin selepas log masuk

问题 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
}
Salin selepas log masuk
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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!