我试着在我的go代码中实现一些单元测试,发现模拟方法的主题相当困难。我有下面的例子,希望你能帮助我:)
在第一层我有下面的代码:
package api
import (
"fmt"
"core"
)
type createUserDTO struct {
Id string
}
func ApiMethod() {
fmt.Println("some incoming api call wit user")
incomingUserData := &createUserDTO{Id: "testId"}
mapedUser := incomingUserData.mapUser()
mapedUser.Create()
}
func (createUserDTO *createUserDTO) mapUser() core.User {
return &core.UserCore{Id: createUserDTO.Id}
}
第二层有以下代码:
package core
import (
"fmt"
)
type CoreUser struct{ Id string }
type User interface {
Create()
}
func (user CoreUser) Create() {
fmt.Println("Do Stuff")
}
我现在的问题是,我如何在不测试核心包的情况下测试api包中的每一个公共方法,尤其是方法Create()。
1条答案
按热度按时间0x6upsns1#
基于这些评论,我创建了一个简单的GitHub仓库来展示我通常是如何在Go语言中处理结构化项目的。目前仓库还没有考虑测试部分,但是用这个项目结构插入测试部分应该是很容易的。
让我们从常规文件夹的布局开始:
controllers
services
db
dto
models
现在,我们来看看相关的文件。
models/user.go
此处为简单结构定义。
dto/user.go
我们使用一个虚拟的
AddedOn
字段来丰富模型结构,该字段仅用于演示。db/user.go
这里,我们定义了一个使用
User
仓库的接口,在我们的测试中,我们可以提供一个mock来代替UserDb
结构体的示例。services/user.go
这是在表示层和底层存储库之间建立连接的层。
controllers/user.go
这里,我们定义了(通过依赖注入)使用
UserService
结构的控制器。你可以在GitHub上的我的存储库中找到所有的东西,如果它澄清了一点,请告诉我。