gpt4 book ai didi

testing - 如何在测试中将模型与 Controller 分开?

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:59 25 4
gpt4 key购买 nike

所以我想在测试中将 Controller 与模型隔离开来,这样我就可以在出现问题时轻松解决问题。之前,我只是用模拟数据访问端点,但很难排除故障,因为测试从路由器一直运行到数据存储。所以我想也许我会为每个 Controller (和模型)创建两个版本(MockController 与 Controller ),并根据模式变量的值使用一个。简而言之,这就是我计划实现它的方式。

const mode string = "test"

// UserModelInterface is the Interface for UserModel
type UserModelInterface interface {
Get()
}

// UserControllerInterface is the Interface for UserController
type UserControllerInterface interface {
Login()
}

// NewUserModel returns a new instance of user model
func NewUserModel() UserModelInterface {
if mode == "test" {
return &MockUserModel{}
} else {
return &UserModel{}
}
}

// NewUserController returns a new instance of user controller
func NewUserController(um UserModelInterface) UserControllerInterface {
if mode == "test" {
return &MockUserController{}
} else {
return &UserController{}
}
}

type (
UserController struct {um UserModelInterface}
UserModel struct {}

// Mocks
MockUserController struct {um UserModelInterface}
MockUserModel struct {}
)

func (uc *UserController) Login() {}
func (um *UserModel) Get() {}

func (uc *MockUserController) Login() {}
func (um *MockUserModel) Get() {}

func main() {
um := NewUserModel()
uc := NewUserController(um)
}

这样我就可以跳过 MockUserController.Login() 中的 sql 查询,只验证有效负载并返回有效响应。

你觉得这个设计怎么样?您有更好的实现方案吗?

最佳答案

我会让调用 NewUserController() 和 NewUserModel() 的代码决定是创建模拟实现还是真实实现。如果您一直使用这种依赖注入(inject)模式直到顶部,您的代码将变得更清晰并且耦合度更低。例如。如果服务器使用用户 Controller ,它看起来类似于:

真实的:

u := 新用户 Controller ()s := 新服务器(u)

在测试中:

u := NewMockUserController()s := 新服务器(u)

关于testing - 如何在测试中将模型与 Controller 分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26580497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com