【问题标题】:Mock functions in golang for testinggolang 中的模拟函数用于测试
【发布时间】:2020-01-02 15:49:56
【问题描述】:

我想通过模拟其他包(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
}

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

【问题讨论】:

  • 如果您停止尝试模拟这些函数,但将它们(或适当的抽象,例如以接口的形式)提供给您的被测函数,它可能会更干净。然后你可以注入一个假的或存根。非常简单,非常干净,易于测试且没有嘲弄。
  • @Volker 感谢您的回答,我是 golang 新手,能否请您用一些代码模板详细说明答案,以便我理解。

标签: unit-testing go mocking testify


【解决方案1】:

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

把你的代码改成这样(重点是定义几个接口以获得更好的可测试性):

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

【讨论】:

  • 感谢您的回答,我明白了,NewMocking() 的功能是什么?是返回结构类型调用模拟还是假 FetchAllData()?如果是,我应该在哪里定义 NewMocking() 函数。我是 golang 新手,所以请详细说明。
  • if !testing {...}testing 是什么?
  • @user10082110 是的,你需要一个 NewMocking 函数。而if !testing {...} 只是告诉您,您可以在需要时构造一个模拟对象。
猜你喜欢
  • 2022-11-22
  • 1970-01-01
  • 2016-08-09
  • 2023-04-04
  • 2017-02-05
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多