3

我有定义在main.go中无法访问的函数main_test.go。但是,在一些在线教程中,我看到函数是可以访问的:我想了解它们的区别,以及如何以惯用的方式构造这些函数。

具体来说,我有一个包含多个二进制文件的应用程序:

myapp/cmd/app/main.go
myapp/cmd/cli/main.go

我目前有很多func mainmain.go文件中运行的简单单元测试逻辑。我只是在测试单个函数并让它们打印它们的输出,如果可以避免的话,我并不是试图调用“测试”套件的全部功能。

由于此时我在 main.go 顶部的测试很长,我想将它们移动到特定的测试文件中,例如:

myapp/cmd/app/main_test.go
myapp/cmd/cli/main_test.go

这适用于我的 makefile:

# Makefile

all: test build
build:
    go build -o cmd/app/main cmd/app/main.go
    go build -o cmd/cli/main cmd/cli/main.go
test:
    go test ./cmd/app/main_test.go
    go test ./cmd/cli/main_test.go

如果我只想运行我的测试文件,我想在我的app/main.go

// cmd/app/main.go
package main

func definedInMain(m string) string {
  // 
}

func main() {
  m := definedInMain("1")
  fmt.Println(m)
  // all the rest of my app's logic...
}

并在我的运行它main_test.go

// cmd/app/main_test.go

package main

// no imports, I hope?

func testDefinedInMain() {
  m := definedInMain("1")
  fmt.Println(m)  
}

但是,这失败了:

undefined: definedInMain
FAIL

我很困惑,我必须将所有这些功能导入我的main_test.go文件(即使我尝试,它也建议"can't load package: ... myapp/cmd/app/main" in any of: ..."

是否有一种干净且惯用的方式让我在测试文件中测试我非常简单的单元测试并在主文件中运行我的函数,而无需大量重写导入或其他实质性的重新架构?

从一些链接中,我的印象是,如果我做了一个main_test.go,导入将自行跟随(就像在这些示例中那样)。

因此,您可以看到我对免费导入其功能的教程感到有些困惑,而我没有,我只是想更好地了解魔术。

只是我的函数definedInMain是私有的,因为它是小写的吗?我确实希望这个函数是私有的,但我希望它能够像在 main.go 中一样被导出到 main_test.go 文件中。我是否必须完全公开才能在另一个文件中进行测试?这似乎不正确,例如,“只能在 go 中对公共方法进行单元测试?”

4

1 回答 1

3

如果@Mustafa Simav 想要发布该答案,我会接受,但如果不接受,则将其关闭:

解决方案是使用具有以下完整路径的非本地导入$GOPATH。whatever_test.go 确实可以正确地自动导入,即使是非导出的小写函数,这正是我想要进行单元测试的。由于进口,这很难看到。

于 2018-10-02T22:26:31.123 回答