Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing golang中用于测试的模拟函数_Unit Testing_Go_Mocking_Testify - Fatal编程技术网

Unit testing golang中用于测试的模拟函数

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() //

我想为CreateData()函数编写unittest用例,通过模拟其他包(package2)中的FetchAllData()和SaveData(),请帮助我用示例模拟函数

提前谢谢


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 ...
}