Golang测试中,断言函数返回nil失败。

5
我尝试进行一个返回 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
}

测试用例:

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
}

1
我猜你正在使用 github.com/stretchr/testify/assert 包,但是为了消除任何歧义,你可能需要在你的问题中明确说明。 - jub0bs
2
你的样例一开始就无法编译。添加一个字符可以在语法上通过,但是它仍然是错误的,因为缺少了一个 return - torek
抱歉,我已经处理了您的两条评论。 - Slim
2
使用assert.Nil来测试nil值。 - blackgreen
1个回答

10

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

equal方法使用interface{}参数,因此在第二次断言中,您正在比较包含类型信息(* Metadata)和空值的接口值与不包含类型信息和空值的接口。

您可以通过以下方式强制第二个接口也包含一个类型:

assert.Equal(t, meta, (*Metadata)(nil))

另请参阅 FAQ 中的 “为什么我的 nil 错误值不等于 nil?”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接