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) ...
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()) } }
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()
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 desnodes sont /nodes
,API 的基本 URL 是 /api
,但这两者都没有在这里反映出来,从我看到的例子来看它们是不必要的。 Echo 的示例始终使用 /
comme points finaux.
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")
et insérez-le CreateNode
:
info("Header: %v", ctx.Request().Header)
Cela me donne :
2023/08/26 20:04:36 INFO: Header: map[Content-Type:[application/x-www-form-urlencoded] Testing:[Yes]]
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)
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!