您的位置:

关于testify的(fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg))

  发布时间:2025-01-02 09:50:27
该问题通常出现在使用 testify 库进行单元测试时,尝试使用 mock.AnythingOfType 传递函数类型时。解决方法是将 Func 函数参数替换为 mock.AnythingOfType("%T")。示例代码演示了如何正确使用 mock.AnythingOfType 避免这个问题。

问题原因

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)这个问题。