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