Saya baru mengenali Go. Saya menulis pelayan API yang dibina di atas pelayan Echo menggunakan penjana OpenAPI DeepMap dan Postgres menggunakan pgxpool. Ia berfungsi dengan baik dan berusia setahun, tetapi itu tidak bermakna ia ditulis dengan betul :).
Pelayan ujian telah menggunakan skrip shell dan satu siri panggilan Curl, yang berfungsi dengan baik, tetapi saya cuba mengemas kini ujian untuk menggunakan rangka kerja ujian Go. Saya telah melakukan beberapa ujian asas, tetapi apa-apa sahaja yang memerlukan nilai borang tidak berfungsi - fungsi pengendali tidak melihat sebarang nilai bentuk, jadi saya rasa permintaan itu tidak merangkumnya, tetapi saya tidak faham kenapa.
Berikut ialah bahagian pertama kaedah CreateNode()
, yang melaksanakan sebahagian daripada antara muka API yang dijana. Saya telah meninggalkan badan; bahagian yang gagal adalah apa yang muncul dalam konteks.
func (si *ServerImplementation) CreateNode(ctx echo.Context) error { vals, err := ctx.FormParams() info("In CreateNode() with FormParams %v", vals) ...
Ini adalah fungsi ujian:
func TestCreateNode(t *testing.T) { // not the actual expected return expected := "Node created, hooray\n" // initialize database with current schema api := &ServerImplementation{} err := api.Init("host=localhost database=pgx_test user=postgres") if err != nil { t.Fatal(err) } // handle teardown in this deferred function t.Cleanup(func() { t.Log("Cleaning up API") api.Close() }) // start up webserver e := echo.New() // this didn't work either //f := make(url.Values) //f.Set("name", "node1") //req := httptest.NewRequest(http.MethodPost, "/nodes/", strings.NewReader(f.Encode())) //req.Header.Add("Content-Type", "multipart/form-data") req := httptest.NewRequest(echo.POST, "/", strings.NewReader(`{"name":"node1"}`)) req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON) rec := httptest.NewRecorder() ctx := e.NewContext(req, rec) if assert.NoError(t, api.CreateNode(ctx)) { assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, expected, rec.Body.String()) } }
Saya tidak akan mengganggu output ujian penuh, kerana apabila CreateNode()
tidak menerima sebarang nilai, semuanya gagal:
=== RUN TestCreateNode 2023/08/26 15:09:43 INFO: In CreateNode() with FormParams map[] 2023/08/26 15:09:43 INFO: No name provided in CreateNode()
Setahu saya, saya mengikuti contoh yang serupa dengan teliti. Saya harap ini adalah perincian yang mencukupi, tetapi tidak mahu membebankan isu dengan kod sokongan yang tidak perlu.
Titik akhirnod ialah /nodes
,API 的基本 URL 是 /api
,但这两者都没有在这里反映出来,从我看到的例子来看它们是不必要的。 Echo 的示例始终使用 /
sebagai titik akhir.
Baiklah, saya Ding Dong.
Saya telah mengumpulkan banyak contoh untuk mendapatkan sesuatu untuk berfungsi, dan hanya sekali saya mencuba perkara berikut dalam fungsi ujian:
req.Header.Set("Testing", "Yes")
dan masukkannya CreateNode
:
info("Header: %v", ctx.Request().Header)
Ini memberi saya:
2023/08/26 20:04:36 INFO: Header: map[Content-Type:[application/x-www-form-urlencoded] Testing:[Yes]]
Saya nampak permintaan ini berjalan lancar, ia ada kaitan dengan cara saya membentuk permintaan.
Saya menyemak contoh sekali lagi dan menyedari bahawa saya menetapkan nilai borang berdasarkan satu contoh tetapi menetapkan jenis kandungan daripada contoh lain. Karya-karya tersebut adalah seperti berikut:
f := make(url.Values) f.Set("name", "node1") req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(f.Encode())) req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationForm)
Sudah tentu, melakukan ini melalui JSON tidak akan berfungsi kerana itu bukan cara CreateNode() menghuraikan maklumat yang masuk.
Ini hanyalah kecuaian saya!
Atas ialah kandungan terperinci Pembolehubah bentuk tidak tersedia dalam ujian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!