在 Go 应用程序中,在不同的服务的单独文件中定义了 getter 函数。每个函数都将数据库连接和 SQL 参数作为输入,并返回结构化数据或错误。当尝试从主包中模拟这些函数时,会出现此问题。
方法 1:模拟函数值
在 Go 中,它无法直接模拟函数。但是,您可以模拟函数值,其中包括变量、结构上的字段和函数参数。为此,请将函数定义为变量或将其作为参数传递给另一个函数。
方法 2:使用接口
首选方法是模拟接口。定义一个表示 getter 函数功能的接口,并实现该接口的真实版本和模拟版本。这允许您在测试期间注入模拟实现。
方法 3:模拟数据库连接
如果 getter 函数依赖于数据库连接,您可以模拟数据库而是连接类型。定义一个模拟实际数据库连接方法的接口并实现一个模拟版本。这使您能够在测试期间将模拟连接传递给 getter 函数。
type ProductRepository interface { GetProductById(db DBIface, ID int) (p Product, err error) } type ProductStore struct{} func (ProductStore) GetProductById(db DBIface, ID int) (p Product, err error) { // Your original implementation } type ProductRepositoryMock struct{} func (ProductRepositoryMock) GetProductById(DB DBIface, ID int) (p Product, err error) { // Mock implementation }
在此示例中,ProductRepository 接口定义了 GetProductById 函数。 ProductStore 结构使用真实的数据库连接来实现该接口。 ProductRepositoryMock 结构体提供了用于测试的模拟实现。
通过使用接口或模拟函数值,您可以在 Go 中实现模拟,而无需修改原始函数声明,从而使测试和隔离变得更加容易。
以上是如何有效地模拟Go中的函数进行单元测试?的详细内容。更多信息请关注PHP中文网其他相关文章!