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.
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
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!