golang 测试断言函数返回 nil 失败

xD-*_*eem 5 testing null go

我试图断言一个返回 nil 的函数,但我试图断言 nil 但以下断言没有意义。我正在使用github.com/stretchr/testify/assert 框架来断言

通过: assert.Equal(t, meta == nil, true)

失败:assert.Equal(t, meta, nil)

我不知道为什么这有任何意义。有人可以帮忙吗?

正在测试的方法:

type Metadata struct {
    UserId          string
}

func GetAndValidateMetadata(metadata map[string]string) (*Metadata, error) {
    userId _ := metadata["userId"]
    if userId == "" {
        return nil, errors.New("userId is undefined")
    }
    meta := Metadata{
        UserId:          userId,
    
    }
    return &meta, nil
}
Run Code Online (Sandbox Code Playgroud)

测试用例:

func TestValidation(t *testing.T) {
    metadata := map[string]string{
        "fakeUserId": "testUserId",
    }
    meta, err := GetAndValidateMetadata(metadata)

 assert.Equal(t, meta == nil, true) <--- passes
 assert.Equal(t, meta, nil) <--- fails
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 11

Go 中的接口值存储类型和该类型的值。

equal 方法采用 interface{} 参数,因此在第二个断言中,您将包含类型信息(*元数据)和 nil 值的接口值与没有类型信息和 nil 值的接口进行比较。

您可以强制第二个接口也包含如下类型:

assert.Equal(t, meta, (*Metadata)(nil))
Run Code Online (Sandbox Code Playgroud)

另请参阅“为什么我的 nil 错误值不等于 nil?” 在常见问题解答中。