Bonjour,
ça fait un petit moment que je fais du Go, et plus récemment une nouvelle application en Go et je n’ai pas encore fait de tests unitaires. (Oups )
J’ai une fonction qui me retourne un utilisateur (struct) dans un autre UserApi (struct pour le rendu en API).
func (u User) ToApi() UserApi {
uApi := UserApi{
ID: u.Identifier.ID,
Username: u.Username,
Email: u.Email,
Firstname: u.Firstname,
Lastname: u.Lastname,
}
return uApi
}
Et le test unitaire associé:
func TestUser_ToApi(t *testing.T) {
user := User{
Identifier: Identifier{ID:1},
Username: "UName",
Email: "UEmail@wxtodo.local",
Password: "UPass",
Firstname: "UFirst",
Lastname: "ULast",
Groups: nil,
Projects: nil,
}
userApi := UserApi{
ID: user.ID,
Username: user.Username,
Email: user.Email,
Firstname: user.Firstname,
Lastname: user.Lastname,
}
if diff := deep.Equal(user.ToApi(), userApi); diff != nil {
t.Error(diff)
}
}
Dans un premier temps, j’aurais aimé savoir si pour l’exemple donnée je suis dans le juste.
Ça, c’est pour le tests des méthodes ne faisant pas appel à ma base de données. Je suis totalement perdu pour savoir comment faire des tests sur mes méthodes traitant avec la base de données, ainsi que les méthodes qui renvoie les résultats sur mon API.
Voici un exemple de deux méthodes/fonctions pour lesquels je ne n’arrive pas écrire de tests. (Pour l’interaction avec la base de donnée, j’utilise gorm).
//Load user groups from database into &u
func (u *User) GetGroups() error {
return dbengine.
Preload("Groups", func(db *gorm.DB) *gorm.DB {
return db.Order("groups.id ASC").Preload("Tasks")
}).
Find(u).
Error
}
func ListAuthUserGroups(ctx *context.APIContext) {
// ** Documentation swagger enlevé pour l'exemple
err := ctx.User.GetGroups()
if err != nil {
//TODO: Log
ctx.Status(http.StatusInternalServerError)
}else {
ctx.JSON(http.StatusOK, models.ToGroupsApi(ctx.User.Groups, false, false, true))
}
}
Hier après-midi, j’ai regardé pas mal d’articles sur internet parlant de tests unitaires en liens avec la DB, mais c’est toujours assez flou. Ça parle de mock, etc. (Et dans bien des cas, pour une fonction de 10 lignes je me retrouverais avec un tests de 60 lignes, … )