Pembolehubah bentuk tidak tersedia dalam ujian

PHPz
Lepaskan: 2024-02-06 08:09:07
ke hadapan
414 orang telah melayarinya

Pembolehubah bentuk tidak tersedia dalam ujian

Kandungan soalan

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)
        ...
Salin selepas log masuk

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())
        }
}
Salin selepas log masuk

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()
Salin selepas log masuk

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 akhir

nod ialah /nodes ,API 的基本 URL 是 /api ,但这两者都没有在这里反映出来,从我看到的例子来看它们是不必要的。 Echo 的示例始终使用 / sebagai titik akhir.


Jawapan betul


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")
Salin selepas log masuk

dan masukkannya CreateNode:

info("Header: %v", ctx.Request().Header)
Salin selepas log masuk

Ini memberi saya:

2023/08/26 20:04:36 INFO:    Header: map[Content-Type:[application/x-www-form-urlencoded] Testing:[Yes]]
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan