Saya melewati array struct di dalam struct, dalam pengujian unit, saya telah menggunakan dto ServiceAccounts dan kode pengujian saya TestStoreServiceAccounts. Bagaimana cara melewatkan array struct di dalam struct? Bersarang struct adalah yang gagal saya pahami .

func TestStoreServiceAccounts(t *testing.T) {
StoreServiceAccounts = func(serviceAccounts []models.ServiceAccount) ([]string, error) {
    ServiceAccounts := []string{"service-account-details-inserted"}
    return ServiceAccounts, nil
}
Data := dto.ServiceAccountRequestDTO{
    ServiceAccounts : []{ //error on this line
        WorkspaceID:        1,
        ServiceAccountName: "sa-10",
        ServiceAccountKey: dto.ServiceAccountKey{
            Type:                    "service_account",
            ProjectID:               "abc",
            PrivateKeyID:            "123",
            PrivateKey:              "234",
            ClientEmail:             "read-clusters",
            ClientID:                "cdf",
            AuthURI:                 "https://accounts.google.com/o/oaut",
            TokenURI:                "https://oauth2.googleapis.com/token",
            AuthProviderX509CertURL: "https://www.googleapis.com",
            ClientX509CertURL:       "xwy",
        },
        CreatedAt: "2021-03-08 17:05:21.0",
        UpdatedAt: "2021-03-08 17:05:21.0",
        CreatedBy: "user-01",
        UpdatedBy: "user-01",
    },
}

responseData, err := clusterService.StoreServiceAccountsService(context.Background(), Data)
serviceAccountsdata := []string{"service-account-details-inserted"}

assert.Nil(t, err)
assert.NotNil(t, responseData)
assert.EqualValues(t, serviceAccountsdata, responseData)

}

    // ServiceAccountRequestDTO - DTO of service account model
type ServiceAccountRequestDTO struct {
    ServiceAccounts []struct {
        WorkspaceID        int64             `json:"workspace_id"`
        ServiceAccountName string            `json:"serviceAccountName"`
        ServiceAccountKey  ServiceAccountKey `json:"serviceAccountKey"`
        CreatedAt          string            `json:"created_at"`
        UpdatedAt          string            `json:"updated_at"`
        CreatedBy          string            `json:"created_by"`
        UpdatedBy          string            `json:"updated_by"`
    } `json:"serviceAccounts"`
}```
-1
Abhishek Ratnam 12 Mei 2021, 10:26

1 menjawab

Jawaban Terbaik

TL;DR: tentukan struct ServiceAccount Anda di luar struct DTO sehingga Anda dapat menggunakannya kembali.

Karena Anda mendefinisikan struktur ServiceAccounts di dalam struktur ServiceAccountRequestDTO, Anda juga perlu mendefinisikannya lagi saat Anda membuat objek, seperti:

Data := dto.ServiceAccountRequestDTO{
    ServiceAccounts : []struct{
        WorkspaceID        int64             `json:"workspace_id"`
        ServiceAccountName string            `json:"serviceAccountName"`
        ServiceAccountKey  ServiceAccountKey `json:"serviceAccountKey"`
        CreatedAt          string            `json:"created_at"`
        UpdatedAt          string            `json:"updated_at"`
        CreatedBy          string            `json:"created_by"`
        UpdatedBy          string            `json:"updated_by"`
    } `json:"serviceAccounts"`{ //start of slice (it's technically not an array) of objects
        { // first object
          WorkspaceID:        1,
          ServiceAccountName: "sa-10",
          ServiceAccountKey: dto.ServiceAccountKey{
              Type:                    "service_account",
              ProjectID:               "abc",
              PrivateKeyID:            "123",
              PrivateKey:              "234",
              ClientEmail:             "read-clusters",
              ClientID:                "cdf",
              AuthURI:                 "https://accounts.google.com/o/oaut",
              TokenURI:                "https://oauth2.googleapis.com/token",
              AuthProviderX509CertURL: "https://www.googleapis.com",
              ClientX509CertURL:       "xwy",
          },
          CreatedAt: "2021-03-08 17:05:21.0",
          UpdatedAt: "2021-03-08 17:05:21.0",
          CreatedBy: "user-01",
          UpdatedBy: "user-01",
        },
        // .. more ServiceAccount objects ...
    },
}

Sekarang ini tentu saja sangat menyakitkan untuk menulis dan membaca dan menggandakan banyak kode. Jadi alih-alih Anda harus mendefinisikan struktur di luar


type ServiceAccount struct{
        WorkspaceID        int64             `json:"workspace_id"`
        ServiceAccountName string            `json:"serviceAccountName"`
        ServiceAccountKey  ServiceAccountKey `json:"serviceAccountKey"`
        CreatedAt          string            `json:"created_at"`
        UpdatedAt          string            `json:"updated_at"`
        CreatedBy          string            `json:"created_by"`
        UpdatedBy          string            `json:"updated_by"`
    } `json:"serviceAccounts"`
}

type ServiceAccountRequestDTO struct {
    ServiceAccounts []ServiceAccount
}

Dan kemudian Anda dapat membuat DTO Anda seperti ini

Data := dto.ServiceAccountRequestDTO{
    ServiceAccounts : []ServiceAccount{ //start of slice of objects
        ServiceAccount { // first object
          WorkspaceID:        1,
          ServiceAccountName: "sa-10",
          ServiceAccountKey: dto.ServiceAccountKey{
              Type:                    "service_account",
              ProjectID:               "abc",
              PrivateKeyID:            "123",
              PrivateKey:              "234",
              ClientEmail:             "read-clusters",
              ClientID:                "cdf",
              AuthURI:                 "https://accounts.google.com/o/oaut",
              TokenURI:                "https://oauth2.googleapis.com/token",
              AuthProviderX509CertURL: "https://www.googleapis.com",
              ClientX509CertURL:       "xwy",
          },
          CreatedAt: "2021-03-08 17:05:21.0",
          UpdatedAt: "2021-03-08 17:05:21.0",
          CreatedBy: "user-01",
          UpdatedBy: "user-01",
        },
        // .. more ServiceAccount objects ...
    },
}

1
FrontSide 12 Mei 2021, 08:08