2016-11-26 4 views
0

私は自分のコードのテストコードを書いており、100%のコードカバレッジを得たいと考えています。googを完全にシャットダウンしてgoテストを実行するには?

これは、たとえばglog.Fatal()を呼び出すコーナーケースをテストすることを意味します。

私が最初に必要なのは、glogをテストしていないので、glogによって出力を無効にすることです。だから私は/tmpまたはspittigメッセージをstderrにファイルを生成せずにテストを実行することができます。

私が必要とするもう1つは、glog.Fatal()を呼び出してos.Exit()を呼び出しても、テストの実行を妨げないということです。

どうすれば達成できますか?

答えて

0

glogインターフェイスでプログラミングすれば実現できます。私はそれが何であるかわからないんだけど、それは次に

type Logger interface { 
    Fatal() 
    Info() 
    // etc... 
} 

あなたのパッケージのようになります/機能/構造体など、地球を含めたに反対のインターフェースを必要としなければなりません。

type SomeStruct struct { 
    log Logger 
} 

またはあなたのトップレベルのモジュール上:

func SomeFunc(log Logger) {} 

インターフェースを使用してはロガー特定の実装からコードを分離します。

ユニットテストでは、テスト固有のロガー(スタブまたはモック)を作成できます。

type TestLogger struct {} 
func (tl TestLogger) Fatal() {} 
func (tl TestLogger) Info() {} 
// etc.... 

次に、あなたのコードは、本番コードでは、実際のGlogインスタンスをインスタンス化して設定できるようにしています。これをテストするには、Glogインスタンスを "作成する"のように単純にカプセル化する必要があります。あなたはユニットテストNewLoggerにできるはずです

func NewLogger Logger { 
    // configure `Glog` 
    // return `Glog` 
} 

この方法では、実際にロガーへの呼び出しを行うことなく、正しくロガーを設定します。

+0

これは面白そうです。私はグロッグの依存関係を削除します。それはグローバルを使用します。 – chmike

関連する問題