Maison > développement back-end > Golang > Les variables de formulaire ne sont pas disponibles dans les tests

Les variables de formulaire ne sont pas disponibles dans les tests

PHPz
Libérer: 2024-02-06 08:09:07
avant
421 Les gens l'ont consulté

Les variables de formulaire ne sont pas disponibles dans les tests

Contenu des questions

Je suis nouveau sur Go. J'ai écrit un serveur API construit sur le serveur Echo à l'aide du générateur DeepMap OpenAPI et Postgres à l'aide de pgxpool. Cela fonctionne bien et a un an, mais cela ne veut pas dire que c'est écrit correctement :).

Le serveur de test utilise un script shell et une série d'appels Curl, ce qui fonctionne très bien, mais j'essaie de mettre à jour les tests pour utiliser le framework de test de Go. J'ai fait quelques tests de base, mais tout ce qui nécessite des valeurs de formulaire ne fonctionne pas - la fonction de gestionnaire ne voit aucune valeur de formulaire, donc je suppose que la requête ne les encapsule pas, mais je ne le fais pas. comprendre pourquoi.

Ce qui suit est la première partie de la méthode CreateNode(), qui implémente une partie de l'interface API générée. J'ai omis le corps ; la partie défaillante est ce qui apparaît dans le contexte.

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

Voici la fonction de test :

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())
        }
}
Copier après la connexion

Je ne m'embêterai pas avec le résultat complet du test, car lorsque CreateNode() ne reçoit aucune valeur, tout échoue :

=== 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()
Copier après la connexion

Pour autant que je sache, je suis de près des exemples similaires. J'espère que c'est suffisamment de détails, mais je ne veux pas surcharger le problème avec du code de support inutile.

Les points finaux des

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


Bonne réponse


D'accord, je m'appelle Ding Dong.

J'ai bricolé de nombreux exemples pour essayer de faire fonctionner quelque chose, et une seule fois j'ai essayé ce qui suit dans une fonction de test :

req.Header.Set("Testing", "Yes")
Copier après la connexion

et insérez-le CreateNode :

info("Header: %v", ctx.Request().Header)
Copier après la connexion

Cela me donne :

2023/08/26 20:04:36 INFO:    Header: map[Content-Type:[application/x-www-form-urlencoded] Testing:[Yes]]
Copier après la connexion

Je vois que cette demande se passe bien, cela a à voir avec la manière dont je forme la demande.

J'ai vérifié à nouveau les exemples et j'ai réalisé que je définissais la valeur du formulaire en fonction d'un exemple mais que je définissais le type de contenu à partir d'un autre exemple. Les travaux sont les suivants :

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

Bien sûr, faire cela via JSON ne fonctionnera pas car ce n'est pas ainsi que CreateNode() analyse les informations entrantes.

C'est juste ma négligence !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal