我是Golang的新手。
我正在努力进行表驱动测试,我想这样做:
testCases := []struct {
name string
testUserID uint
expected User // <- maybe nil
expectedError error
}
因为被测试函数的返回值为*User, error
。
用户就是这样,它被定义为数据库方案。
type User struct {
ID uint
CreatedAt time.Time
UpdatedAt time.Time
...
}
但是在这种情况下,我无法将expected
设为零。
我该怎么做?
还是我做表驱动测试的方法是错误的?
答案 0 :(得分:5)
对于空字段,您可以检查为零的空值,如果为struct,则该空值不为零。
当通过声明为变量分配存储空间时 或调用new或创建新值时(通过 复合文字或make的调用,并且没有显式初始化 如果提供,则变量或值被赋予默认值。每个元素 这样的变量或值的类型为其类型设置为零值: 对于布尔值,为false;对于数字类型,为0;对于字符串,为“”;对于布尔值,为nil 指针,函数,接口,切片,通道和映射。
在您的情况下,正在使用Struct而不是struct的指针。值不为nil,但为空
var user User
fmt.Println(user == User{}) // will print true
但是由于您的情况返回的值是指向结构*User, error
的指针,因此您可以检查nil
var user *User
fmt.Println(user == nil) // will print true
创建一个指向struct字段的指针。
testCases := []struct {
name string
testUserID uint
expected *User // <- maybe nil
expectedError error
}
答案 1 :(得分:1)
Go基本类型定义了零值,并且不能为nil。
如果您希望一个值简单地为nillable,请使其成为指针。
如果您不希望使用指针行为,则可以使用第三方程序包中的空类型,
例如https://github.com/guregu/null
例如,将int实现为:
type Int struct {
Int int
Valid bool
}
另一种解决方案是编写具有可空值的自己的结构
答案 2 :(得分:1)
您还可以使用特殊的sql类型:
type structName struct {
id sql.NullInt64
name sql.NullString
field sql.NullBool
}