Heim >Backend-Entwicklung >Golang >MockDB (Variable vom Typ *MockDB) kann nicht als *gorm.DB-Wert im Strukturliteral verwendet werden

MockDB (Variable vom Typ *MockDB) kann nicht als *gorm.DB-Wert im Strukturliteral verwendet werden

WBOY
WBOYnach vorne
2024-02-14 22:10:08786Durchsuche

MockDB (Variable vom Typ *MockDB) kann nicht als *gorm.DB-Wert im Strukturliteral verwendet werden

Bei der PHP-Entwicklung können Probleme auftreten, wenn MockDB (eine Variable vom Typ MockDB) als gorm.DB-Wert in der Struktur verwendet wird. In diesem Fall kann MockDB nicht direkt gorm.DB zugewiesen werden. Dies kann dazu führen, dass der Code nicht kompiliert werden kann oder Laufzeitfehler auftreten. In Bezug auf dieses Problem schlug der PHP-Editor Xigua vor, andere Methoden zu verwenden, um es zu lösen, beispielsweise die Typkonvertierung oder die Neugestaltung der Codelogik, um sicherzustellen, dass der gorm.DB-Wert in der Struktur korrekt zugewiesen werden kann. Durch die Verwendung der richtigen Methode zur Behandlung dieses Problems können unnötige Fehler und Ausnahmen vermieden und die Zuverlässigkeit und Stabilität des Codes verbessert werden.

Frageninhalt

Ich habe eine Get-Funktion erstellt, um Übungen aus der Postgres-Datenbank abzurufen. Ich habe einen Mock-Test geschrieben, erhalte jedoch diesen Strukturfehler. Wie kann ich ihn beheben?

Ich habe eine Handlerstruktur verwendet, die die Struktur *gorm.db hat.

Fehler:

Mockdb (Variable vom Typ *mockdb) kann nicht als *gorm.db-Wert im Strukturliteral verwendet werden

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

Ich möchte Mock-Tests mit meiner Handler-Struktur durchführen

Workaround

mockdb 和 gorm 的 db Es handelt sich um zwei verschiedene Strukturen, die nicht austauschbar verwendet werden können. Wenn sie dieselbe Schnittstelle implementieren, können sie am selben Ort verwendet werden. Zum Beispiel:

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

Jetzt können Sie *gorm.db 传递给代码中的 registerroutes 函数。为了进行测试,如果 mockdb 结构实现了 store alle Methoden in der Benutzeroberfläche nutzen und nutzen.

Das obige ist der detaillierte Inhalt vonMockDB (Variable vom Typ *MockDB) kann nicht als *gorm.DB-Wert im Strukturliteral verwendet werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen