2016-04-15 6 views
0

Ich habe zwei Dateien in einem Paket namens db, von denen eine einige nicht exportierte Variablen definiert hat. Ein weiteres ist eine Testdatei und müßte diese Variablen verwenden, etwa so:Nicht definierte Variablen innerhalb eines Pakets während Build

(Dies ist die Struktur des Projektes)

$GOPATH/src/gitlab.com/myname/projectdir 
├── main.go 
└── db 
    ├── add.go 
    └── add_test.go 

(Hier ist eine lapidare Variation der Dateien)

db/add.go

package db 

func Add(x, y int) int { 
    return x + y 
} 

// some other functions that use a and b from `add_test.go` 

db/add_test.go

package db 

import (
    "testing" 
) 

var (
    a = 1 
    b = 2 
) 

// test function use variables from add.go 
func testAdd(t *testing.T) { 
    result := add(a, b) 
    if result != 3 { 
     t.Error(err) 
    } 
} 

Laufen go test innerhalb db/ Verzeichnis geführt, aber sobald ich go run main go lief erzeugt es den folgenden Fehler:

db/add.go:: undefined: a
db/add.go:: undefined: b

Scheint, wie add.go nicht a und b von add_test.go während des Build finden.

main.go

package main 

import (
    "fmt" 
    "gitlab.com/myname/projectdir/db" 
) 

func main() { 
    res := db.Add(1, 2) 
    fmt.Println(res) 
} 

ist dies, weil add_test.go nicht während des Build enthalten?

Antwort

2

Dies ist nur die Art, wie Werkzeug funktioniert.

_test.go Dateien werden nur kompiliert, wenn Sie go test ausführen. Wenn ein Paket aus einem anderen Paket importiert wird, wird kein Code aus den Dateien _test.go verwendet.

Versuchen Sie, go build oder go install aus dem db-Paket auszuführen. Es wird scheitern.

1

Relative Pfade sind in Go empfindlich. Zum einen denke ich, dass Sie ihnen import "./db" voranstellen müssen. Eine andere Sache ist, dass Sie in Ihrem $ GOPATH/src Standort sein sollten.

Try this:

  • Ihre Dateien unter den $GOPATH/src/project und $GOPATH/src/project/db Verzeichnisse bewegen.
  • Präfix Ihren Importpfad mit ./db für das DB-Paket.

Wie für die IDE, das ist alles, was Plugins Sie verwenden. Versuchen Sie, die Tools selbst auszuführen: golint, go vet, oracle usw., um die tatsächlichen Warnungen und Fehler zu sehen.

+0

Nicht sicher, ich verstehe, was Sie vorschlagen. Schlagen Sie vor, ich verwende relativen Import wie './Db' in jeder Datei innerhalb' db'? – PieOhPah

+0

Ihr Codebeispiel war unvollständig. Ich nahm an, dass 'projectDir' eine 'Paket-Hauptlaufzeit' ist, daher Ihre 'go run main.go'-Anweisung. Es befindet sich innerhalb dieses 'main.go' (und alles andere innerhalb dieses 'main'-Pakets), das auf Ihren db-Code mit' import' ./db "' verweist. Und stellen Sie sicher, dass alles in Ihrem '$ GOPATH/src /' ist. – eduncan911

+0

Entschuldigung, ich habe die Projektstruktur hinzugefügt, um mehr Klarheit zu schaffen. – PieOhPah

0

Testfunktionen sollten mit Test beginnen. das sagt die Dokumentation.

func TestAdd(t *testing.T) { 
    result := Add(a, b) 
    if result != 3 { 
     t.Errorf("expected 3, got %d ", result) 
    } 
} 

Prost.

Verwandte Themen