我正在使用dockertest执行SQL单元测试.这只是一个到*sqlx.DB
的简单连接,但不知何故,它在连接到数据库时生成了错误Error: EOF
.我无法识别错误,可能是配置错误.请救救我!我将接受并支持有效的回复.
import (
"fmt"
"log"
"os"
"testing"
_ "github.com/lib/pq"
"github.com/jmoiron/sqlx"
"github.com/ory/dockertest/v3"
"github.com/ory/dockertest/v3/docker"
)
var (
host = "localhost"
user = "postgres"
password = "postgres"
dbName = "db_test"
port = "5437"
dsn = "host=%s port=%s user=%s password=%s dbname=%s sslmode=disable timezone=UTC connect_timeout=30"
)
var resource *dockertest.Resource
var pool *dockertest.Pool
var testDB *sqlx.DB
var testRepo Repo
func TestMain(m *testing.M) {
// connect to docker; fail if docker not running
p, err := dockertest.NewPool("")
if err != nil {
log.Fatalf("could not connect to docker; is it running? %s", err)
}
pool = p
opts := dockertest.RunOptions{
Repository: "postgres",
Tag: "14.5", // same as docker compose
Env: []string{
"POSTGRES_USER=" + user,
"POSTGRES_PASSWORD=" + password,
"POSTGRES_DB=" + dbName,
},
ExposedPorts: []string{"5432"},
PortBindings: map[docker.Port][]docker.PortBinding{
"5432": {
{HostIP: "0.0.0.0", HostPort: port},
},
},
}
resource, err = pool.RunWithOptions(&opts)
if err != nil {
// _ = pool.Purge(resource)
log.Fatalf("could not start resource: %s", err)
}
if err := pool.Retry(func() error {
var err error
testDB, err = sqlx.Connect("postgres", fmt.Sprintf(dsn, host, port, user, password, dbName))
if err != nil {
log.Println("Error:", err)
return err
}
return testDB.Ping()
}); err != nil {
_ = pool.Purge(resource)
log.Fatalf("could not connect to database: %s", err)
}
err = createTables()
if err != nil {
log.Fatalf("error creating tables: %s", err)
}
code := m.Run()
if err := pool.Purge(resource); err != nil {
log.Fatalf("could not purge resource: %s", err)
}
testRepo = &repo{db: testDB}
os.Exit(code)
}
func createTables() error {
tableSQL, err := os.ReadFile("./testdata/tables.sql")
if err != nil {
fmt.Println(err)
return err
}
_, err = testDB.Exec(string(tableSQL))
if err != nil {
fmt.Println(err)
return err
}
return nil
}
func Test_pingDB(t *testing.T) {
err := testDB.Ping()
if err != nil {
t.Error("can't ping database")
}
}