登录
首页 >  Golang >  Go问答

模拟非接口方法

来源:stackoverflow

时间:2024-02-16 09:24:26 405浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《模拟非接口方法》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我有一个类似这样的 go 代码

func (r *Request) SetRequestMap(ctx *gin.Context, data map[string]interface{}) *Request {
    
    //Some processing code
     
     id, ok := r.map["id"]
    
    if !ok {
        return r
    }

    checkStatus := checkStatusOnline(ctx, id) // checkStatusOnline returns "on" if id is present or "off".
    // It make use of HTTP GET request internally to check if id is present or not. 
    // All json unmarshal is taken care of internally

    if checkStatus == "on" {
        r.map["val"] = "online"
    }

    return r
}

我想为 setrequestmap 编写单元测试用例。

如何在不为模拟实现任何额外函数的情况下模拟 checkstatusonline


解决方案


模拟此类函数的一种方法是使用函数指针:

var checkstatusonline = defaultcheckstatusonline

func defaultcheckstatusonline(...) {... }

在测试运行期间,您可以将 checkstatusonline 设置为不同的实现来测试不同的场景。

func testafunc(t *testing.t) {
   checkstatusonline=func(...) {... }
   defer func() {
      checkstatusonline=defaultcheckstatusonline
   }()
   ...
}

您可以执行此操作来模拟该函数。

// Code

var checkStatusOnline = func(ctx context.Context, id int) int {
    ...
}

// Test

func TestSetRequestMap(t *testing.T) {
    tempCheckStatusOnline := checkStatusOnline
    checkStatusOnline = func(ctx context.Context, id int) int {
        // mock code
    }
    defer checkStatusOnline = tempCheckStatusOnline

    // Test here
}

好了,本文到此结束,带大家了解了《模拟非接口方法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>