2016-04-28 2 views
1

はここ`go test`を実行すると、なぜこの関数は未定義ですか?

package main_test 

import "testing" 

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

go build作品a_test.goコード

a.go

package main 

import "fmt" 

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

func main() { 
} 

です。しかし、私はを実行します。ここで私はあなたがmain.Haha()ようにそれを呼び出す& main_testパッケージにimport "main"に必要

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

答えて

1

は次のようになります。

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

a.go

package main 

import "fmt" 

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

func main() { 
} 

package main 

import "testing" 

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

出力

a_test.go
1

を得るものです。

1は、異なるパッケージの下のパッケージのテストを持っているかもしれない理由だけで手の込んだ、私はテストの二つのカテゴリーがあると言うべきである。

  • まず、パッケージの実施を監督するこれらのテスト、それがインテグリティ、リソース使用状況プロファイル、パフォーマンスベンチマークなどを保証するためにこれらのテストは、パッケージコード自体の横に置かなければなりません。
  • 2番目は、パッケージの機能と使用方法をテストするものです。これらのテストでは、提供しているサービスについてパッケージがそれを支持していることを保証したいと考えています。これらのテストの重要な側面は、私たちが不必要な詳細を公開していないことを保証することです。プライベートな部分がプライベートに保たれ、公開されたAPIが透明であることを保証します。だからこそ、これらのテストはテストの下でパッケージのコンシューマとして動作するために別のパッケージに別の名前で置く必要があります。

一つの例外は、他のパッケージの中から使用することを意図していないパッケージmainので、(@kostyaがコメントしたように)私たちは、パッケージ自体の内部のすべてのテストを書きます。

+0

これは 'package main'には当てはまりません。 – kostya

+0

@kostyaあなたはそうです!それを思い出してくれてありがとう。 –

2

あなたのテストはmain_testというパッケージに含まれており、その機能はmainというパッケージに含まれています。 mainをインポートしていないため、対処方法がありません。

テストがパッケージmainに含まれていない場合は、その機能を3番目のパッケージに移動します。あなたが別のパッケージを持っているので

関連する問題