ZIMP - Unit Test

发布时间 2023-12-21 21:45:28作者: ZhangZhihuiAAA

 

func TestLoginUserAPI(t *testing.T) {
    user, password := randomUser(t)

    testCases := []struct {
        name string
        body gin.H
        buildStubs func(store *mockdb.MockStore)
        checkResponse func(recorder *httptest.ResponseRecorder)
    } {
        {
            name: "OK",
            body: gin.H{
                "username": user.Username,
                "password": password,
            },
            buildStubs: func(store *mockdb.MockStore) {
                store.EXPECT().
                    GetUser(gomock.Any(), gomock.Eq(user.Username)).
                    Times(1).
                    Return(user, nil)
            },
            checkResponse: func(recorder *httptest.ResponseRecorder) {
                require.Equal(t, http.StatusOK, recorder.Code)
            },
        },

This test case failed, because in the function loginUser that is tested there are two calls by the store:

......
user, err := server.store.GetUser(ctx, req.Username)
......
session, err := server.store.CreateSession(ctx, db.CreateSessionParams{
......

but there's only one store.EXPECT() in the test case. 

Add one for the other function call and the test case will pass:

func TestLoginUserAPI(t *testing.T) {
    user, password := randomUser(t)

    testCases := []struct {
        name string
        body gin.H
        buildStubs func(store *mockdb.MockStore)
        checkResponse func(recorder *httptest.ResponseRecorder)
    } {
        {
            name: "OK",
            body: gin.H{
                "username": user.Username,
                "password": password,
            },
            buildStubs: func(store *mockdb.MockStore) {
                store.EXPECT().
                    GetUser(gomock.Any(), gomock.Eq(user.Username)).
                    Times(1).
                    Return(user, nil)
                store.EXPECT().
                    CreateSession(gomock.Any(), gomock.Any()).
                    Times(1)
            },
            checkResponse: func(recorder *httptest.ResponseRecorder) {
                require.Equal(t, http.StatusOK, recorder.Code)
            },
        },