gpt4 book ai didi

unit-testing - 如何正确测试调用其中另一个函数的处理程序

转载 作者:IT王子 更新时间:2023-10-29 02:21:40 24 4
gpt4 key购买 nike

我正在测试看起来像这样的 PostUser 函数(为简单起见省略了错误处理):

func PostUser(env *Env, w http.ResponseWriter, req *http.Request) error {

decoder := json.NewDecoder(req.Body)
decoder.Decode(&user)

if len(user.Username) < 2 || len(user.Username) > 30 {
return StatusError{400, errors.New("usernames need to be more than 2 characters and less than 30 characters")}
}
emailRe := regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`)
if !emailRe.MatchString(user.Email) {
return StatusError{400, errors.New("invalid email address")}
}
if len(user.Password) < 8 {
return StatusError{400, errors.New("passwords need to be more at least 8 characters")}
}

hashedPassword,_ := bcrypt.GenerateFromPassword([]byte(user.Password), 12)


env.DB.InsertUser(user.Username, hashedPassword, user.Email) // need to mock this out


userData,_ := json.Marshal(user)


defer req.Body.Close()

w.Write(userData)

return nil
}

我的 env.go 文件如下所示:

type Env struct {
DB *db.DB
}

我的 db.go 文件如下所示:

type DB struct {
Session *mgo.Session
}

如何通过我的数据库结构模拟 InsertUser 调用,以便我可以对 PostUser 进行单元测试?

最佳答案

要使用模拟进行测试,您需要创建一个您的模拟可以实现的接口(interface)。自然地,您要用其替换模拟的结构也需要实现接口(interface)的所有方法,以便它们可以自由互换。

例如,你可以有一个接口(interface):

type DBInterface interface {
InsertUser(string, string, string)
//all other methods on the DB struct here
}

然后你的数据库结构已经实现了接口(interface)的所有方法。从那里您可以创建一个也实现该接口(interface)的模拟结构。

type DBMock struct {}

func (dbm *DBMock) InsertUser(username, password, email string) {
//whatever mock functionality you want here
return
}

//all other methods also implemented.

然后您可以更改 env 使其具有指向 DBInterface 而不是 DB 的指针。当您设置要传递到处理程序的环境时,在生产版本中使用 DB 结构,在测试中使用 DBMock 结构。

关于unit-testing - 如何正确测试调用其中另一个函数的处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45787965/

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