go - 无法从非根文件夹运行测试

标签 go

我有一个看起来像这样的测试:

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/

相关文章:

go - 迭代时替换 channel

Golang GORM有很多关系

go - 在 Go 中构建 CLI 应用程序/包

ubuntu - 如何在 vagrant provision 期间安装 golang 包?

mongodb - 无法从 MongoDB 中解码 ObjectId SubValue 结果在 Golang 中

http - Go 中的时间 HTTP 响应

import - Go 导入语句中的 '.'(点或句点)有什么作用?

json - 解析嵌套在表单 urlencoded POST 中的 JSON 字符串

go - 在 Go 中,什么时候应该使用 uint 和 int?

go - 如何导入同一个 go 模块的两个版本?