我的测试看起来像:
package tst
import (
"testing"
"github.com/demas/cowl-go/pkg/postgres"
"log"
"os"
"fmt"
"github.com/jmoiron/sqlx"
"github.com/demas/cowl-go/pkg/quzx-crawler"
"github.com/SlyMarbo/rss"
"time"
_ "github.com/lib/pq"
)
func TestMain(m *testing.M) {
prepare()
retCode := m.Run()
os.Exit(retCode)
}
func prepare() {
connectionString := fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=disable",
os.Getenv("DBUSER"),
os.Getenv("DBPASS"),
os.Getenv("DBHOST"),
os.Getenv("DBPORT"),
os.Getenv("DBNAME"))
db, err := sqlx.Open("postgres", connectionString)
if err != nil {
log.Fatal(err)
}
db.Exec(`DELETE FROM Settings`)
db.Exec(`DELETE FROM HackerNews`)
// ....
}
如果我保留在根项目文件夹中,测试工作正常,但是如果我将它们移动到tst
文件夹,我会收到错误消息:
D:\development\gopath\src\github.com\demas\cowl-go\tst>go test -v
2017/03/31 16:30:06 sql: unknown driver "postgres" (forgotten import?)
exit status 1
FAIL github.com/demas/cowl-go/tst 0.085s
为什么?
答案 0 :(得分:4)
正如@JimB在评论中已经提到的,错误意味着您在没有首先导入数据库驱动程序的情况下尝试使用sqlx.Open
打开数据库连接。在您的情况下,可以通过添加此_ "github.com/lib/pq"
导入规范来修复此问题。
如果即使添加了该导入后,您仍然看到相同的错误,那么这意味着您的某个依赖项也在尝试打开数据库连接而不先导入必要的驱动程序。
请注意,虽然log.Fatal
是一种很好而且干净的方式来阻止您的程序,但有时可能会缺少这种方法,正如您已经知道的那样。你可能想要考虑使用panic
,它的输出更加混乱,但另一方面,你会得到引起恐慌的行号和文件名,最终你会学到快速解析它。