2016-05-02 14 views
3

Ich teste http benutzerdefinierten Endpunkt für beegoBeego - Endpoint Testing

package test 

import (
    "github.com/astaxie/beego" 
    . "github.com/smartystreets/goconvey/convey" 
    _ "golife-api-cons/routers" 
    "net/http" 
    "net/http/httptest" 
    "path/filepath" 
    "runtime" 
    "testing" 
) 

func init() { 
    _, file, _, _ := runtime.Caller(1) 
    apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator)))) 
    beego.TestBeegoInit(apppath) 
} 

// TestGet is a sample to run an endpoint test 
func TestGet(t *testing.T) { 
    r, _ := http.NewRequest("GET", "/my/endpoint/fetches/data", nil) 
    w := httptest.NewRecorder() 
    beego.BeeApp.Handlers.ServeHTTP(w, r) 

    beego.Trace("testing", "TestGet", "Code[%d]\n%s", w.Code, w.Body.String()) 

    Convey("Subject: Test Station Endpoint\n", t, func() { 
     Convey("Status Code Should Be 200", func() { 
      So(w.Code, ShouldEqual, 200) 
     }) 
     Convey("The Result Should Not Be Empty", func() { 
      So(w.Body.Len(), ShouldBeGreaterThan, 0) 
     }) 
    }) 
} 

Wenn ich go test -v laufen mit,

ich als Antwort dial tcp :0: getsockopt: connection refused

ich MariaDB bin mit auf meinem lokalen läuft, Ich habe verifiziert mit netstat -tulpn, dass meine Datenbank einwandfrei funktioniert (ich bekomme eine gültige Antwort, wenn ich Postman benutze und mein Server läuft)

Eine seltsame Beobachtung, nach der Aufnahme der Linie _ "golife-api-cons/routers" i erhalten diesen Fehler noch vor ARE Test

Mein Test bestanden lief mit Antwort 200 OK, aber ohne Daten, wie ich als Antwort erhalten den oben genannten Fehler

EDIT

der Standardpfad von durch TestBeegoInit Funktion verwendet wird, ist /path/to/my/project/test , die nicht mit dem gewünschten Weg ist, so dass ich versuchte, zu dem absoluten Pfad geben, noch kann ich nicht DB verbinden.

+0

Mit welchen Einstellungen läuft Ihre App? Sie sagen, Ihre Datenbank läuft, aber woher weiß Ihr Test, mit welcher Datenbank eine Verbindung hergestellt werden soll? – dusual

+0

@dusual - Irgendwelche spezifischen Einstellungen, die Sie brauchen? Überprüfen Sie die gleiche bego.TestBeegoInit () in der Quelle – poorva

Antwort

1

Sie initialisieren Ihre App als

apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator)))) 
    beego.TestBeegoInit(apppath) 
} 

Wo file die Anrufer-Datei ist.

TestBeegoInit ist:

func TestBeegoInit(ap string) { 
    os.Setenv("BEEGO_RUNMODE", "test") 
    appConfigPath = filepath.Join(ap, "conf", "app.conf") 
    os.Chdir(ap) 
    initBeforeHTTPRun() 
} 

daher der Ort, an dem die Tests für die Konfiguration suchen, ist

<this_file>/../conf/app.conf 

, die im Grunde die Datei Standardkonfiguration ist.

Grundsätzlich können Sie keine Verbindung zur Datenbank herstellen. Vielleicht, weil Sie sich unwissentlich auch für die Tests mit Ihrer Standarddatenbank verbinden. Ich vermute, das ist nicht das, was du versuchst.

+0

Sorry, ich vergaß zu erwähnen, dass ich dies bereits ausprobiert hilft nicht Bitte verweisen Sie auf diese [link] (http: // stackoverflow .com/questions/27943563/how-to-make-api-test-files-with-beego) – poorva

1

Nach viel Versuch kam ich zu wissen, dass beego seine Variable als AppPath in beego/conf.go wie genannt initialisiert -

AppPath, _ = filepath.Abs(filepath.Dir(os.Args[0])) 

: wenn Sie Ihre Tests führen Sie sie mit go test -v

aber als Ergebnis der os.Args[0] ist der Text ausführbar, die /tmp/Pfad/zu/Test und nicht Pfad/zu/app/exe

01 sein wird

daher als Ergebnis config/app.conf nicht finden, die in Ihrem App-Pfad ist, der DB-Verbindungsdetails hat. Zuständige Leitung in bego/conf.gehen -

appConfigPath = filepath.Join(AppPath, "conf", "app.conf") 

Das alles in init Funktion des beego passiert, wenn Sie sagen

import (
    "github.com/astaxie/beego" 
    _ "path/to/routers" 
) 

Hack hierfür ist -

erstellen ein neues Paket/Datei mit init-Funktion, die hat aussieht -

package common 

import (
    "os" 
    "strings" 
) 

func init() { 
    cwd := os.Getenv("PWD") 
    rootDir := strings.Split(cwd, "tests/") 
    os.Args[0] = rootDir[0] // path to you dir 
} 

hier ändern Sie os.Args[0] und Verzeichnispfad

stellen Sie sicher, Zuweisen Sie es vor beego importieren Import so jetzt

aussehen wird

import (
    _ "path/to/common" 
    "github.com/astaxie/beego" 
    _ "path/to/routers" 
) 
Und schließlich verbinden Sie DB!