Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tidak dapat menggunakan mockDB (pembolehubah jenis *MockDB) sebagai nilai *gorm.DB dalam struct literal

Tidak dapat menggunakan mockDB (pembolehubah jenis *MockDB) sebagai nilai *gorm.DB dalam struct literal

WBOY
WBOYke hadapan
2024-02-14 22:10:08744semak imbas

Tidak dapat menggunakan mockDB (pembolehubah jenis *MockDB) sebagai nilai *gorm.DB dalam struct literal

Dalam pembangunan PHP, anda mungkin menghadapi masalah apabila menggunakan MockDB (pembolehubah jenis MockDB) sebagai nilai gorm.DB dalam struktur. Dalam kes ini, MockDB tidak boleh ditugaskan terus kepada gorm.DB. Ini boleh menyebabkan kod gagal untuk menyusun atau menyebabkan ralat masa jalan. Mengenai masalah ini, editor PHP Xigua mencadangkan menggunakan kaedah lain untuk menanganinya, seperti menggunakan penukaran jenis atau mereka bentuk semula logik kod untuk memastikan nilai gorm.DB dalam struktur boleh diberikan dengan betul. Menggunakan kaedah yang betul untuk menangani masalah ini boleh mengelakkan ralat dan pengecualian yang tidak perlu dan meningkatkan kebolehpercayaan dan kestabilan kod.

Kandungan soalan

Saya mencipta fungsi get untuk mendapatkan latihan daripada pangkalan data postgres. Saya menulis ujian olok-olok tetapi saya mendapat ralat ini daripada struktur, bagaimana saya boleh membetulkannya?

Saya menggunakan struktur pengendali, yang mempunyai struktur *gorm.db.

Ralat:

Tidak boleh menggunakan mockdb (*pembolehubah jenis mockdb) sebagai nilai *gorm.db dalam struktur literal

// router
package exercises

import (
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
)

type handlers struct {
    db *gorm.db
}

func registerroutes(router *gin.engine, db *gorm.db) {
    h := &handlers{
        db: db,
    }

    routes := router.group("/exercises")
    routes.post("/", h.addexercise)
    routes.get("/", h.getexercises)
    routes.get("/:id", h.getexercise)
    routes.put("/:id", h.updateexercise)
    routes.delete("/:id", h.deleteexercise)
}
// test
package exercises

import (
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/gin-gonic/gin"
    "github.com/kayraberktuncer/sports-planner/pkg/common/models"
    "github.com/stretchr/testify/mock"
    "gorm.io/gorm"
)

type MockDB struct {
    mock.Mock
}

func (m *MockDB) Find(value interface{}) *gorm.DB {
    args := m.Called(value)
    return args.Get(0).(*gorm.DB)
}

func (m *MockDB) Error() error {
    args := m.Called()
    return args.Error(0)
}

func TestGetExercises(t *testing.T) {
    // Setup mock DB
    mockDB := new(MockDB)
    mockDB.On("Find", &[]models.Exercise{}).Return(mockDB).Once()

    // Setup Gin router
    router := gin.New()
    router.GET("/", func(c *gin.Context) {
        handlers := &Handlers{DB: mockDB} // error
        handlers.GetExercises(c)
    })

    // Perform request
    w := httptest.NewRecorder()
    req, _ := http.NewRequest("GET", "/", nil)
    router.ServeHTTP(w, req)

    // Assert response
    if w.Code != http.StatusOK {
        t.Errorf("Expected status code %d, got %d", http.StatusOK, w.Code)
    }

    // Assert mock DB was called correctly
    mockDB.AssertExpectations(t)
}

Saya ingin melakukan ujian olok-olok dengan struktur pengendali saya

Penyelesaian

mockdb 和 gorm 的 db adalah dua struktur berbeza dan anda tidak boleh menggunakannya secara bergantian. Jika mereka melaksanakan antara muka yang sama, mereka boleh digunakan di tempat yang sama. Contohnya:

// router
package exercises

import (
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
)

// this interface will be implemented by gorm.DB struct
type Store interface {
    Create(value interface{}) *gorm.DB
    First(out interface{}, where ...interface{}) *gorm.DB
    Model(value interface{}) *gorm.DB
    Delete(value interface{}, where ...interface{}) *gorm.DB
    Find(out interface{}, where ...interface{}) *gorm.DB
    DB() *sql.DB
    Raw(sql string, values ...interface{}) *gorm.DB
    Exec(sql string, values ...interface{}) *gorm.DB
    Where(query interface{}, args ...interface{}) *gorm.DB
    //other method signatures
}

type Handlers struct {
    DB Store
}

func RegisterRoutes(router *gin.Engine, db Store) {
    h := &Handlers{
        DB: db,
    }

    routes := router.Group("/exercises")
    routes.POST("/", h.AddExercise)
    routes.GET("/", h.GetExercises)
    routes.GET("/:id", h.GetExercise)
    routes.PUT("/:id", h.UpdateExercise)
    routes.DELETE("/:id", h.DeleteExercise)
}

Kini anda boleh *gorm.db 传递给代码中的 registerroutes 函数。为了进行测试,如果 mockdb 结构实现了 store semua kaedah dalam antara muka dan anda boleh menggunakannya.

Atas ialah kandungan terperinci Tidak dapat menggunakan mockDB (pembolehubah jenis *MockDB) sebagai nilai *gorm.DB dalam struct literal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam