无法使用mockDB(*MockDB类型的变量)作为结构文字中的*gorm.DB值

2024年 2月 14日 44.2k 0

无法使用mockdb(*mockdb类型的变量)作为结构文字中的*gorm.db值

在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值的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论