Unit testing golang中用于测试的模拟函数
我想为CreateData()函数编写unittest用例,通过模拟其他包(package2)中的FetchAllData()和SaveData(),请帮助我用示例模拟函数 提前谢谢Unit testing golang中用于测试的模拟函数,unit-testing,go,mocking,testify,Unit Testing,Go,Mocking,Testify,我想为CreateData()函数编写unittest用例,通过模拟其他包(package2)中的FetchAllData()和SaveData(),请帮助我用示例模拟函数 提前谢谢 func CreateData(input package1.InputRequest) (output package1.OututResponse){ ..some code ..some code DBdata, err := package2.FetchAllData() //
func CreateData(input package1.InputRequest) (output package1.OututResponse){
..some code
..some code
DBdata, err := package2.FetchAllData() //function to fetch data from database
..some code
..some code
id, insertErr := package2.SaveData(someData) //function to insert data
..some code
..some code
}
我只需要模拟上面的函数而不修改函数。我正在寻找利用界面功能的方法。它可能需要对依赖项进行一些更改(在本例中为
包2
)
将代码更改为以下内容(要点是定义几个接口以提高可测试性):
需要对程序包2
稍作更改:
type MyStorage struct {}
func (s *MyStorage) FetchAllData ([]Data, error) {
// ... some fetching code
}
func (s *MyStorage) SaveData(someData []Data) (int, error) {
// ... some saving code
}
func NewStorage() *MyStorage {
// ... some initialization
}
如果您想在不需要package2
的情况下执行某些测试,请定义您自己的模拟类型:
type Mocking struct {}
func (s *Mocking) FetchAllData ([]Data, error) {
// ... some mocking logic
}
func (s *Mocking) SaveData(someData []Data) (int, error) {
// ... some mocking logic
}
func NewMocking() *Mocking {
// ... initialize ...
}
如果您不再尝试模拟这些函数,而是将它们(或适当的抽象,例如,以接口的形式)提供给您的测试函数,那么可能会更干净。然后你可以注入一个假的或存根。非常简单,非常干净,易于测试,没有嘲弄。@Volker谢谢你的回答,我是golang的新手,你能不能用一些代码模板详细说明答案,这样我就更容易理解了。谢谢你的回答,我理解了这一点,NewMocking()函数的作用是什么?这是调用mock还是fake FetchAllData()的返回结构类型?如果是,我应该在哪里定义NewMocking()函数。我是刚来golang的,请详细说明。如果有,请点击
if!测试{…}
,什么是测试
?@user10082110是的,您需要一个新的模拟函数。和if!测试{…}
只是告诉您可以在需要时构造模拟对象。
type Mocking struct {}
func (s *Mocking) FetchAllData ([]Data, error) {
// ... some mocking logic
}
func (s *Mocking) SaveData(someData []Data) (int, error) {
// ... some mocking logic
}
func NewMocking() *Mocking {
// ... initialize ...
}