Maison  >  Article  >  développement back-end  >  Passer aux tests unitaires de langue

Passer aux tests unitaires de langue

WBOY
WBOYavant
2024-02-09 09:30:091175parcourir

Go 语言单元测试

L'éditeur php Yuzai vous présentera aujourd'hui les tests unitaires du langage Go. Dans le développement de logiciels, les tests unitaires sont une partie très importante. En écrivant des cas de test, nous pouvons vérifier l'exactitude du code et améliorer la qualité et la maintenabilité du code. Le langage Go fournit un cadre et des outils de test riches, rendant l'écriture et l'exécution de tests unitaires plus faciles et plus efficaces. Cet article vous amènera à comprendre les tests unitaires du langage Go, y compris les statistiques d'écriture, d'exécution et de couverture des cas de test. Examinons de plus près les tests unitaires dans le langage Go !

Contenu du problème

Une erreur user_id de violation de clé primaire s'est produite lors de l'exécution de tests unitaires

Ma fonction de basculement des favoris est la suivante

func ToggleTrackToFavourite(c *gin.Context) {
    userID := GetCurrentUserID(c)
    trackID, err := strconv.Atoi(c.Param("id"))
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid Track ID"})
        return
    }
    if err := favourites.CreateTable(db.DB); err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create table" + err.Error()})
        return
    }
    if isInFavorites(userID, trackID) {
        err = favourites.RemoveFavorite(db.DB, userID, trackID)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to remove track from favorites"})
            return
        }

        c.JSON(http.StatusOK, gin.H{"message": "Track removed from favorites"})
    } else {
        err = favourites.InsertFavorite(db.DB, userID, trackID)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to add track to favorites : " + err.Error()})
            return
        }

        c.JSON(http.StatusOK, gin.H{"message": "Track added to favorites"})
    }
}
func GetCurrentUserID(c *gin.Context) int {
    userID, exists := c.Get("userID")
    if !exists {
        return 0
    }
    if userIDInt, ok := userID.(int); ok {
        return userIDInt
    }
    return 0
}

La fonction de test unitaire du code ci-dessus est la suivante

func TestToggleTrackToFavourite(t *testing.T) {
    db.InitTestDB()

    if err := users.CreateTable(db.DB); err != nil {
        t.Fatalf("Failed to create users table: %v", err)
    }
    if err := tracks.CreateTable(db.DB); err != nil {
        t.Fatalf("Failed to create tracks table: %v", err)
    }
    if err := favourites.CreateTable(db.DB); err != nil {
        t.Fatalf("Failed to create favorites table: %v", err)
    }
    user := users.User{
        Username: "Test",
        Email:    "[email protected]",
        Password: "123456",
    }
    if err := users.CreateUser(db.DB, &user); err != nil {
        t.Fatalf("Failed to create user: %v", err)
    }

    sampleTrack := tracks.Track{
        Name:         "Test track",
        Index:        10,
        Track:        "chere.mp4",
        Image:        "image.jpg",
        Album_ID:     4,
        Is_Published: true,
    }
    if err := tracks.CreateTrack(db.DB, &sampleTrack); err != nil {
        t.Fatalf("Failed to insert the example track: %v", err)
    }

    r := gin.Default()
    r.PUT("/user/favorite/toggle/:id", ToggleTrackToFavourite)

    reqAddToFavorites := httptest.NewRequest("PUT", "/user/favorite/toggle/1", nil)
    wAddToFavorites := httptest.NewRecorder()

    r.ServeHTTP(wAddToFavorites, reqAddToFavorites)
    assert.Equal(t, http.StatusOK, wAddToFavorites.Code)
    assert.Equal(t, `{"message":"Track added to favorites"}`, wAddToFavorites.Body.String())

    // reqRemoveFromFavorites := httptest.NewRequest("PUT", "/user/favorite/toggle/1", nil)
    // reqAddToFavorites.Params = append(reqAddToFavorites.Params, httptest.Param{"id", "1"})
    // wRemoveFromFavorites := httptest.NewRecorder()
    // r.ServeHTTP(wRemoveFromFavorites, reqRemoveFromFavorites)
    // assert.Equal(t, http.StatusOK, wRemoveFromFavorites.Code)
    // assert.Equal(t, `{"message":"Track removed from favorites"}`, wRemoveFromFavorites.Body.String())

    if _, err := db.DB.Exec("DROP TABLE IF EXISTS favorite"); err != nil {
        t.Fatalf("Failed to drop the table: %v", err)
    }
    if _, err := db.DB.Exec("DROP TABLE IF EXISTS tracks"); err != nil {
        t.Fatalf("Failed to drop the table: %v", err)
    }
    if _, err := db.DB.Exec("DROP TABLE IF EXISTS users"); err != nil {
        t.Fatalf("Failed to drop the table: %v", err)
    }
}

Je ne sais pas comment transmettre la valeur par défaut de la fonction GETCURRENTUSER à 1 dans le test unitaire

Je veux juste ajouter/supprimer des pistes des favoris

Solution de contournement

L'ID utilisateur dans le code semble être stocké dans une variable locale appelée "userId" dans la variable locale de contexte d'un middleware d'authentification avant le gestionnaire, donc le configurer est suffisant pour tester, vous pouvez modifier ces lignes :

r := gin.Default()
    c.Set("userID", "1")
    r.PUT("/user/favorite/toggle/:id", ToggleTrackToFavourite)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer