关于testify的(fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg))
问题原因
fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg) 这个错误消息出现的原因是因为在 testify 库中,在设置期望值(expectations)的时候,如果使用了函数类型 Func 而不是具体的参数值,就会导致这个错误。在设置期望值时,应该使用 mock.AnythingOfType(\"%T\") 来代替动态参数。 在 testify 中,期望值的设置需要提供具体的参数值,而不是函数类型,因为函数类型无法直接匹配期望值。因此,为了解决这个问题,需要使用 mock.AnythingOfType(\"%T\") 来表示任何类型的参数,以便满足设置期望值的需求。 正确的示例代码如下:
import (
"testing"
"github.com/stretchr/testify/mock"
)
type MyStruct struct {
SomeFunc func(int) string
}
func TestMyStruct(t *testing.T) {
// 创建 Mock 对象
mockObj := new(MyStruct)
// 设置期望值
mockObj.SomeFunc = func(arg int) string {
// 在这里编写期望值的返回逻辑
return "mocked result"
}
// 调用被测试函数
result := mockObj.SomeFunc(123)
// 断言
if result != "mocked result" {
t.Errorf("Expected 'mocked result', but got %s", result)
}
}
在上面的示例代码中,我们使用了 testify 库来创建一个 Mock 对象,并设置了期望值 mockObj.SomeFunc,然后在被测试函数中调用该函数,并对返回结果进行断言,以验证期望值设置的正确性。
解决方案
fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg))
该问题通常出现在使用testify
库进行单元测试时,尝试使用mock.AnythingOfType
传递函数类型时。这是因为testify
不支持直接在期望中使用函数类型,而是需要使用mock.AnythingOfType("%T")
来代替。
要解决这个问题,您可以将Func
函数参数替换为mock.AnythingOfType("%T")
,这样就不会再出现fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg)
的错误信息。
下面是一个示例,演示了如何使用mock.AnythingOfType
来代替函数类型:
package mypackage
import (
"testing"
"github.com/stretchr/testify/mock"
)
type MyMockStruct struct {
mock.Mock
}
func (m *MyMockStruct) MyMethod(inputFunc func(int) int) int {
args := m.Called(inputFunc)
return args.Int(0)
}
func TestMyMethod(t *testing.T) {
myMock := new(MyMockStruct)
// 使用mock.AnythingOfType("%T")代替函数类型
myMock.On("MyMethod", mock.AnythingOfType("%T")).Return(42)
result := myMock.MyMethod(func(i int) int { return i * 2 })
if result != 42 {
t.Errorf("Expected result to be 42, but got %d", result)
}
}
在上面的示例中,我们成功解决了fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg)
的问题,通过使用mock.AnythingOfType("%T")
来替换函数类型。
具体例子
fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg)
这个问题一般是在使用Go语言的testify
测试框架时出现的。这个问题的原因是在测试用例中使用了mock.AnythingOfType
时,传入的参数类型不匹配,导致了该错误提示。
要解决这个问题,需要确保在使用mock.AnythingOfType
时,传入的参数类型和期望的参数类型匹配。具体来说,需要保证传入的参数和期望的参数具有相同的类型,即mock.AnythingOfType
的参数应该是被期望的参数的类型。
下面是一个示例代码,演示了如何正确使用mock.AnythingOfType
,避免出现这个问题:
package main
import (
"testing"
"github.com/stretchr/testify/mock"
)
type MyMockStruct struct {
mock.Mock
}
func (m *MyMockStruct) MyMethod(arg string) {
_ = m.Called(arg)
}
func TestMyMethod(t *testing.T) {
mockStruct := new(MyMockStruct)
expectedArg := "test"
mockStruct.On("MyMethod", mock.AnythingOfType("string")).Return()
mockStruct.MyMethod(expectedArg)
mockStruct.AssertExpectations(t)
}
在上面的示例中,我们定义了一个名为MyMockStruct
的结构体,并在其中定义了一个方法MyMethod
。在测试用例TestMyMethod
中,我们使用mockStruct.On
来设置对MyMethod
方法的期望调用,其中使用了mock.AnythingOfType("string")
来指定参数类型为string
。接着调用被测试方法,并最终通过mockStruct.AssertExpectations(t)
来断言测试的预期调用是否都被满足。
通过以上示例,我们可以正确使用mock.AnythingOfType
来避免出现fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg)
这个问题。