Heim >Backend-Entwicklung >Golang >Formularvariablen sind in Tests nicht verfügbar

Formularvariablen sind in Tests nicht verfügbar

PHPz
PHPznach vorne
2024-02-06 08:09:07424Durchsuche

Formularvariablen sind in Tests nicht verfügbar

Frageninhalt

Ich bin neu bei Go. Ich habe mit dem DeepMap OpenAPI-Generator und Postgres mit pgxpool einen API-Server geschrieben, der auf dem Echo-Server aufbaut. Es funktioniert gut und ist ein Jahr alt, aber das bedeutet nicht, dass es richtig geschrieben ist :).

Der Testserver hat ein Shell-Skript und eine Reihe von Curl-Aufrufen verwendet, was großartig funktioniert, aber ich versuche, die Tests zu aktualisieren, um das Test-Framework von Go zu verwenden. Ich habe einige grundlegende Tests durchgeführt, aber alles, was Formularwerte erfordert, funktioniert nicht – die Handlerfunktion sieht keine Formularwerte, daher vermute ich, dass die Anfrage sie nicht kapselt, aber das tue ich nicht verstehen warum.

Das Folgende ist der erste Teil der CreateNode()-Methode, die einen Teil der generierten API-Schnittstelle implementiert. Ich habe den Hauptteil weggelassen; der fehlerhafte Teil erscheint im Kontext.

func (si *ServerImplementation) CreateNode(ctx echo.Context) error {
        vals, err := ctx.FormParams()
        info("In CreateNode() with FormParams %v", vals)
        ...

Das ist die Testfunktion:

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())
        }
}

Ich werde mich nicht mit der vollständigen Testausgabe befassen, denn wenn CreateNode() keinen Wert erhält, schlägt alles fehl:

=== 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()

Soweit ich weiß, verfolge ich ähnliche Beispiele aufmerksam. Ich hoffe, dass dies detailliert genug ist, möchte das Problem aber nicht mit unnötigem Supportcode überladen.

Die Endpunkte von

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


Richtige Antwort


Okay, ich bin Ding Dong.

Ich habe viele Beispiele zusammengeschustert, um etwas zum Laufen zu bringen, und nur einmal habe ich Folgendes in einer Testfunktion ausprobiert:

req.Header.Set("Testing", "Yes")

und reinstecken CreateNode:

info("Header: %v", ctx.Request().Header)

Das gibt mir:

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

Ich sehe, dass diese Anfrage gut ankommt, das hängt mit der Art und Weise zusammen, wie ich die Anfrage formuliere.

Ich habe die Beispiele noch einmal überprüft und festgestellt, dass ich den Formularwert basierend auf einem Beispiel festgelegt habe, den Inhaltstyp jedoch anhand eines anderen Beispiels. Die Arbeiten sind wie folgt:

f := make(url.Values)
        f.Set("name", "node1")
        req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(f.Encode()))
        req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationForm)

Natürlich funktioniert dies über JSON nicht, da CreateNode() auf diese Weise die eingehenden Informationen nicht analysiert.

Das ist einfach meine Nachlässigkeit!

Das obige ist der detaillierte Inhalt vonFormularvariablen sind in Tests nicht verfügbar. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen