在 Golang 中测试接受不返回值的回调函数的方法

我正在尝试测试以下功能:


// SendRequestAsync sends request asynchronously, accepts callback

//  func, which it invokes

//

// Parameters:

// - `context` : some context

// - `token` : some token

// - `apiURL` : the URL to hit

// - `callType` : the type of request to make. This should be one of

//  the HTTP verbs (`"GET"`, `"POST"`, `"PUT"`, `"DELETE"`, ...)

// - `callBack` : the func to invoke upon completion

// - `callBackCustomData`: the data to invoke `callBack` with

//

// Since this is an async request, it doesn't return anything.

func (a *APICoreSt) SendRequestAsync(context interface{}, token string, apiURL string, callType APIType, header map[string]string, jsonBody []byte,

    callBack OnCompletion, callBackCustomData interface{}) {

    go func(data interface{}) {

        callBack(a.SendRequest(context, token, apiURL, callType, header, jsonBody), data)

    }(callBackCustomData)

}

其中OnCompletion定义为:


type OnCompletion func(result CallResultSt, data interface{})

我立刻想到创建一个间谍回调。为此,我分叉了这个框架,提出了以下内容:


// outside the test function

type MySpy struct {

    *spies.Spy

}


func (my *MySpy) Callback(res CallResultSt, data interface{}) {

    my.Called(res, data)

    fmt.Println("Hello world")

    return

}


//in the test function

spy := new(MySpy)


//...some table-driven test logic the generator came up with, containing my data


spy.MatchMethod("Callback", spies.AnyArgs)

assert.NotEmpty(t, spies.CallsTo("Callback"))

它向我打招呼


panic: runtime error: invalid memory address or nil pointer dereference [recovered]

    panic: runtime error: invalid memory address or nil pointer dereference

我该如何解决这个问题,并测试这个方法?


胡子哥哥
浏览 119回答 1
1回答

喵喔喔

我会放弃间谍的东西。此任务非常简单,您不需要外部依赖项来处理它。您可以改为制作自己的“间谍”,它有一个通道,它在调用函数时将 args 传递到其中。在您的测试中,您然后尝试从频道接收。这将强制测试等待回调函数被调用。您还可以考虑添加一个超时时间,这样测试就可以失败,而不是在函数从未被调用时永远阻塞。// outside the test functiontype MySpy struct {&nbsp; &nbsp; Args chan MySpyArgs}type MySpyArgs struct {&nbsp; &nbsp; Res&nbsp; CallResultSt&nbsp; &nbsp; Data interface{}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}func (my *MySpy) Callback(res CallResultSt, data interface{}) {&nbsp; &nbsp; my.Args <- MySpyArgs{Res: res, Data: data}}//in the test functionspyChan := make(chan MySpyArgs)spy := &MySpy{spyChan}//...some table-driven test logic the generator came up with, containing my dataargs := <-spyChan// can now assert arguments were as you expected, etc.一个粗略的工作示例:https ://play.golang.org/p/zUYpjXdkz-4 。如果你想使用超时:...select {case args := <-spyChan:&nbsp; &nbsp; // assertions on argscase <-time.After(5 * time.Second):&nbsp; &nbsp; // prevent blocking for over 5 seconds and probably fail the test}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go