gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:33:38 25 4
gpt4 key购买 nike

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

提前致谢


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
}

我只需要模拟上面的函数而不修改函数。我正在寻找那个

最佳答案

利用界面功能。它可能需要对依赖项进行一些更改(在本例中为 package2)。

将您的代码更改为类似这样的内容(重点是定义多个接口(interface)以提高可测试性):

type Fetcher interface {
FetchAllData() ([]Data, error)
}

type Saver interface {
SaveData([]Data) (int, error)
}


func CreateData(input package1.InputRequest) (output package1.OututResponse){

..some code
..some code

// when you are writing tests, replace it with `s := NewMocking()`
s := package2.NewStorage()

DBdata, err := s.FetchAllData() //function to fetch data from database

..some code
..some code

id, insertErr := s.SaveData(someData) //function to insert data

..some code
..some code
}

需要对 package2 做一点改动:

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

关于unit-testing - golang 中用于测试的模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com