J'ai du mal à faire un test sur table, et je veux le faire:
testCases := []struct {
name string
testUserID uint
expected User // <- maybe nil
expectedError error
}
Parce que les valeurs de retour de la fonction testée sont *User, error
.
L'utilisateur est comme ça, il est défini comme schéma DB.
type User struct {
ID uint
CreatedAt time.Time
UpdatedAt time.Time
...
}
Mais dans ce cas, je ne peux pas faire expected
nil.
Comment puis-je faire ceci?
Ou mon approche pour faire un test piloté par table est fausse?
Pour un champ vide, vous pouvez vérifier les valeurs vides qui sont des valeurs nulles qui ne sont pas nulles en cas de struct.
Lorsque le stockage est alloué pour une variable, soit via une déclaration ou un appel de new, soit lorsqu'une nouvelle valeur est créée, soit via un littéral composite ou un appel de make, et qu'aucune initialisation explicite n'est fournie, la variable ou la valeur est donnée une valeur par défaut. Chaque élément d'une telle variable ou valeur est défini sur la valeur zéro pour son type: false pour les booléens, 0 pour les types numériques, "" pour les chaînes et nil pour les pointeurs, les fonctions, les interfaces, les tranches, les canaux et les cartes.
Dans votre cas, utilisez la structure et non un pointeur vers la structure. La valeur n'est pas nulle, mais elle est vide
var user User
fmt.Println(user == User{}) // will print true
Mais puisque dans votre cas, la valeur renvoyée est un pointeur sur struct *User, error
vous pouvez vérifier zéro
var user *User
fmt.Println(user == nil) // will print true
Créez un champ struct qui est un pointeur.
testCases := []struct {
name string
testUserID uint
expected *User // <- maybe nil
expectedError error
}
Les types de base Go ont des valeurs nulles définies et ne peuvent pas être nuls.
Si vous voulez qu'une valeur soit simplement nillable, faites-en un pointeur.
Si vous ne souhaitez pas de comportement de pointeur, vous pouvez utiliser des types Null à partir de packages tiers,
par exemple. https://github.com/guregu/null
par exemple int est implémenté comme:
type Int struct {
Int int
Valid bool
}
une autre solution consiste à écrire votre propre structure avec une valeur nullable