我有一个看起来像这样的测试:
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
为什么?
最佳答案
正如@JimB 在评论中提到的那样,该错误意味着您正在尝试使用 sqlx.Open
打开数据库连接,而没有先导入数据库驱动程序。在您的情况下,这可以通过添加此 _ "github.com/lib/pq"
import spec 来解决。
如果即使在添加该导入之后,您仍然看到相同的错误,则这意味着您的一个依赖项也在尝试打开数据库连接,而没有首先导入必要的驱动程序。
请注意,虽然 log.Fatal
是停止程序的好方法,但有时可能会缺少它,正如您已经知道的那样。你可能想考虑使用 panic
代替,它的输出更加困惑,但另一方面,你会得到导致 panic 的行号和文件名,最终你会学会快速解析它。
关于go - 无法从非根文件夹运行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43142080/