首页 > 后端开发 > Golang > 如何模拟 Go 中的函数以进行有效的测试?

如何模拟 Go 中的函数以进行有效的测试?

Susan Sarandon
发布: 2024-12-05 09:15:14
原创
639 人浏览过

How Can I Mock Functions in Go for Effective Testing?

如何在 Go 中制作可模拟函数

在 Go 中,模拟在具体类型中声明的特定函数是不可行的。但是,您可以使用多种选项来实现可测试性:

模拟函数值

可以在 Go 中模拟作为变量、结构体字段或函数参数出现的函数值。请考虑以下内容:

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())
登录后复制

在每种情况下,Fn 都是可模拟的。

利用接口

接口提供了 Go 中有效且首选的模拟方法。考虑以下示例:

type ProductRepository interface {
    GetProductById(DB *sql.DB, ID int) (p Product, err error)
}

// Real implementation
type ProductStore struct{}

func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    q := "SELECT * FROM product WHERE id = ?"
    // ...
}

// Mock implementation
type ProductRepositoryMock struct {}

func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}
登录后复制

依赖于 ProductRepository 的代码可以利用 ProductStore 进行正常执行,并利用 ProductRepositoryMock 进行测试。

通过接口调整函数

保留大部分在启用模拟的同时,保留函数的原始结构,创建一个镜像要传递给函数的类型的方法的接口。然后,实现接口的模拟版本并在测试期间使用它。

type DBIface interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    // ...
}

type DBMock struct {}

func (DBMock) Query(query string, args ...interface{}) (*sql.Rows, error) {
    // ...
}

func GetProductByName(DB DBIface, name string) (p Product, err error) {
   ...
}
登录后复制

GetProductByName 中的 DB 参数现在是可模拟的。

以上是如何模拟 Go 中的函数以进行有效的测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板