Maison  >  Article  >  développement back-end  >  Impossible d'utiliser mockDB (variable de type *MockDB) comme valeur *gorm.DB dans le littéral de structure

Impossible d'utiliser mockDB (variable de type *MockDB) comme valeur *gorm.DB dans le littéral de structure

WBOY
WBOYavant
2024-02-14 22:10:08677parcourir

Impossible dutiliser mockDB (variable de type *MockDB) comme valeur *gorm.DB dans le littéral de structure

Dans le développement PHP, vous pouvez rencontrer des problèmes lors de l'utilisation de MockDB (une variable de type MockDB) comme valeur gorm.DB dans la structure. Dans ce cas, MockDB ne peut pas être directement affecté à gorm.DB. Cela peut entraîner l’échec de la compilation du code ou provoquer des erreurs d’exécution. Concernant ce problème, l'éditeur PHP Xigua a suggéré d'utiliser d'autres méthodes pour le résoudre, comme l'utilisation de la conversion de type ou la refonte de la logique du code pour garantir que la valeur gorm.DB dans la structure peut être attribuée correctement. Utiliser la bonne méthode pour résoudre ce problème peut éviter les erreurs et exceptions inutiles et améliorer la fiabilité et la stabilité du code.

Contenu de la question

J'ai créé une fonction get pour obtenir des exercices de la base de données postgres. J'ai écrit un test simulé mais j'obtiens cette erreur de la structure, comment puis-je la corriger ?

J'ai utilisé la structure du gestionnaire, qui a la structure *gorm.db.

Erreur :

Impossible d'utiliser mockdb (variable de type *mockdb) comme valeur *gorm.db dans la structure littérale

// 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)
}

Je souhaite faire des tests simulés avec ma structure de gestionnaire

Workaround

mockdb 和 gorm 的 db sont deux structures différentes et vous ne pouvez pas les utiliser de manière interchangeable. S'ils implémentent la même interface, ils peuvent être utilisés au même endroit. Par exemple :

// 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)
}

Vous pouvez désormais *gorm.db 传递给代码中的 registerroutes 函数。为了进行测试,如果 mockdb 结构实现了 store toutes les méthodes dans l'interface et vous pouvez l'utiliser.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer