Home > Backend Development > Golang > Go language unit testing

Go language unit testing

WBOY
Release: 2024-02-09 09:30:09
forward
1217 people have browsed it

Go 语言单元测试

php Xiaobian Yuzai will introduce to you the unit testing of Go language today. In software development, unit testing is a very important part. By writing test cases, we can verify the correctness of the code and improve code quality and maintainability. Go language provides a rich testing framework and tools, making writing and running unit tests easier and more efficient. This article will lead you to understand the unit testing of Go language, including the writing, running and coverage statistics of test cases. Let’s take a deeper look at unit testing in the Go language!

Problem content

Primary key violation user_id error occurred when running unit tests

My togglefavourite function is as follows

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"})
    }
}
Copy after login
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
}
Copy after login

The unit test function of the above code is as follows

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)
    }
}
Copy after login

Don’t know how to pass the default value of GETCURRENTUSER function as 1 in unit test

Just want to add/remove tracks from favorites

Workaround

The user ID in the code seems to be stored in a context local variable in some authentication middleware before the handler in a local variable called "userId", so setting it is enough for testing, you can change these lines:

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

The above is the detailed content of Go language unit testing. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template