mockcompose 使用一种允许您生成模拟类的方法,您可以指示mockcompose 包含您选择的依赖闭包(从其他包中导入的任何函数)。同时,它会生成带有本地覆盖的主题函数的克隆副本,以便您可以进行测试。您可以使用go generate 嵌入代码生成过程,因此请确保您的克隆副本始终与您的代码更改同步。
假设你有一个函数 functionThatUsesGlobalFunction 可以导入
Sprintf 在包中fmt。
func functionThatUsesGlobalFunction(
format string,
args ...interface{},
) string {
//
// skip fansy logic...
//
// call out to a global function in fmt package
return fmt.Sprintf(format, args...)
}
您的目标是测试 functionThatUsesGlobalFunction 与 Sprintf 包中的 fmt 被嘲笑。
为此,您可以将go generate 配置为mockcompose,如下所示:
mocks.go
//go:generate mockcompose -n mockFmt -p fmt -mock Sprintf
//go:generate mockcompose -n mockJson -p encoding/json -mock Marshal
//go:generate mockcompose -n clonedFuncs -real "functionThatUsesGlobalFunction,fmt=fmtMock"
package clonefn
go generate mockcompose 将为您生成管道类,使您可以编写如下测试代码:
package clonefn
import (
"testing"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
var fmtMock *mockFmt = &mockFmt{}
func TestClonedFuncs(t *testing.T) {
assert := require.New(t)
// setup function mocks
fmtMock.On("Sprintf", mock.Anything, mock.Anything).Return("mocked Sprintf")
// inside functionThatUsesMultileGlobalFunctions: fmt.Sprintf is mocked
assert.True(functionThatUsesGlobalFunction_clone("format", "value") == "mocked Sprintf")
}
详情请关注this。