【问题标题】:How to mock external methods for unit testing如何模拟单元测试的外部方法
【发布时间】:2021-03-12 16:27:41
【问题描述】:

我想模拟 Go 中的测试方法。我无法弄清楚模拟通常遵循的任何步骤/模式。

考虑下面的代码并帮助我理解。

包 fetchClient

client.go

type Client struct {
    URL     string
}

type ClientData struct {
    ID      string       
}

func (p *Client) GetURL(ID string) (*ClientData) {
    data := &ClientData{}
    //Some work to store client information into data struct and return it 
    return data
}

包 fetchClientData

FetchData.go

// Function GetData that accepts a client ID as argument and returns client URL
func GetData(ID string) (*fetchClient.Client.URL) {
    param := (*Client).GetURL(ID) 
    return param
}

FetchData_test.go //想知道如何模拟下面的问题。

问题:如何在 FetchData_test.go 文件中模拟一个虚假的 GetURL 函数,使其不调用 FetchData.go 文件中的实际 GetURL 函数,而是模拟它。

【问题讨论】:

  • 在 Go 中,您通常根本不模拟。您提供假货或存根。使用 net/http/httptest 设置一个伪造的 HTTP 服务器进行测试很简单。
  • 你不模拟方法或函数,你模拟类型。
  • 您需要将依赖项作为参数传递给您的结构/函数,而不是在它们的主体中创建它们。

标签: unit-testing go methods interface mocking


【解决方案1】:

可能有两种方法可以解决您的问题。我只能根据您发布的代码非常少做一些假设。但是您要么必须创建通过 http 测试实现函数的模拟库,要么可以将函数调用迁移到要使用/消耗的接口中,以便您可以在 GoMock 中使用 MockGen 功能。后者可能会更干净,更接近 Go 最佳实践。

查看他们的文档。 https://github.com/golang/mock

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多