模拟一个非接口函数
Mocking a non-interface function
我有一个像这样的 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
}
我有一个像这样的 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
}