在PHP開發中,使用MockDB(一種MockDB類型的變數)作為結構體中的gorm.DB值可能會遇到問題。在這種情況下,無法直接將MockDB賦值給gorm.DB。這可能導致程式碼無法通過編譯或出現運行時錯誤。對於這個問題,php小編西瓜建議使用其他方式來處理,例如使用型別轉換或重新設計程式碼邏輯,以確保結構體中的gorm.DB值能夠正確賦值。使用正確的方法來處理這個問題,可以避免不必要的錯誤和異常,並提高程式碼的可靠性和穩定性。
我建立了一個 get 函數,用於從 postgres 資料庫取得練習。我編寫了模擬測試,但我從結構中收到此錯誤,如何修復它?
我使用了 handler 結構,它有 *gorm.db 結構。
錯誤:
不能使用mockdb(*mockdb類型的變數)作為結構文字中的*gorm.db值
// 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) }
我想用我的處理程序結構進行模擬測試
mockdb
和gorm 的db
# 是兩個不同的結構,您不能互換使用它們。如果它們實現相同的接口,則可以在相同的地方使用它們。例如:
// 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) }
現在,您可以將 *gorm.db
傳遞給程式碼中的 registerroutes
函數。為了進行測試,如果 mockdb
結構實作了 store
介面中的所有方法,則可以使用它。
以上是無法使用mockDB(*MockDB類型的變數)作為結構文字中的*gorm.DB值的詳細內容。更多資訊請關注PHP中文網其他相關文章!