在 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中文网其他相关文章!