2016-04-28 47 views
1

下面是代碼爲什麼這個函數在運行`go test`時未定義?

a.go

package main 

import "fmt" 

func Haha() { 
    fmt.Println("in Haha") 
} 

func main() { 
} 

a_test.go

package main_test 

import "testing" 

func TestA(t *testing.T) { 
    Haha() 
} 

go build作品。但是當我運行~/gopath/src/zjk/misc$ go test -v。以下是我得到

# zjk/misc_test 
./a_test.go:6: undefined: Haha 
FAIL zjk/misc [build failed] 

回答

1

,因爲你有不同的包

應該是:

a.go

package main 

import "fmt" 

func Haha() { 
    fmt.Println("in Haha") 
} 

func main() { 
} 

a_test.go

package main 

import "testing" 

func TestA(t *testing.T) { 
    Haha() 
} 

輸出:

# zjk/misc_test 
in Haha 
PASS 
ok  github.com/qwertmax/so 0.009s 
1

您需要import "main"main_test包&這樣稱呼它main.Haha()

只是爲了闡述爲什麼一個人可能有不同的包下一個包的測試,我應該說,有兩類測試:

  • 首先,那些監督一攬子實施測試,內部,以確保其完整性,資源使用情況和性能基準等。這些測試應該與包代碼本身一起使用。
  • 其次是那些測試軟件包的功能和用法。在這些測試中,我們希望確保一個軟件包能夠支持它提供的服務。這些測試的一個重要方面是,他們確保我們不會暴露任何不必要的細節;以確保私人部分保持私人和公共API清晰。這就是爲什麼這些測試應該駐留在另一個包中,以不同的名稱作爲測試包下的消費者。

一個例外是包main這並不意味着從其他包內使用,所以我們只寫包本身內部的所有測試(如@kostya評論)。

+0

我不認爲這適用於'package main'。 – kostya

+0

@kostya你是對的!感謝提醒。 –

2

您的測試位於名爲main_test的程序包中,該功能位於名爲main的程序包中。您沒有導入main,因此無法解決此問題。

如果您的測試不能在包main中,請將該功能移至第三個包。

相關問題