2016-01-25 18 views
5

私は一度、永遠に実行を開始するアプリ(epazote)を持っているが、私は押されたり殺されCTRL + Cまでブロック/待機の前にいくつかの値をテストしたいです。私はテスト、またはどのようにこのケースをテストするためしながらコードの一部を無視することがかのうであるかどうかを知りたい、私は、インターフェイスを実装しているhttp://play.golang.org/p/t0spQRJB36は永遠に

package main 

import (
    "fmt" 
    "os" 
    "os/signal" 
) 

type IAddString interface { 
    AddString(string) 
} 

type addString struct{} 

func (self *addString) AddString(s string) { 
    fmt.Println(s) 
} 

func block(a IAddString, s string) { 

    // test this 
    a.AddString(s) 


    // ignore this while testing 
    block := make(chan os.Signal) 
    signal.Notify(block, os.Interrupt, os.Kill) 

    for { 
     signalType := <-block 
     switch signalType { 

     default: 
      signal.Stop(block) 
      fmt.Printf("%q signal received.", signalType) 
      os.Exit(0) 
     } 
    } 
} 

func main() { 
    a := &addString{} 
    block(a, "foo") 
} 

:ここ

が小さい例でありますこのケースはAddStringのテストに役立ちましたが、それは私がいくつかの部分をテストするのに役立ちましたが、 "ブロック"とテストを回避する方法は全く分かりませんでした。

アイデア?

更新:別の関数の作品にしかその機能をテストするためのループAddstring内のコードを置くが、私は完全なコードカバレッジを行いたい場合は、私はまだ、たとえば、遮断部をテストする/確認する必要がありますctrl + cまたはkill -HUPを受け取ったときに正しく動作するかどうかをテストするには、偽のを作成することを考えていましたが、動作する可能性がある場合にインポートされたパッケージを上書きする方法はわかりません。

+8

はい、可能です。ループ内にあるコードを別の関数に置き、ループなしで機能する単体テストを入れます。 – GolezTrol

+0

私は@GolezTrolに同意します。ゴレズ、答えセクションにそれを入れてupvote ;-) – Daniel

+0

永遠にループするコード?私は無限ループを持つことが良いときに良いシナリオを知りたいです。それはパフォーマンスにとっては本当に悪いことです。ではない? – Erick

答えて

0

コードにテストデリゲートを導入します。

ループを、引数として2つの関数onBeginEventとonEndEventを取る関数に抽出します。関数のシグネチャは講じ:

  • 状態を使用すると、テストケースの内側に検査すること
  • オプション:ループ回数のカウンタ(あなたが各ループを識別することができます)。実際のデリゲートの実装では、それ自体で呼び出された回数をカウントできるため、オプションです。

ループの始めに、OnBegingEvent(counter、currentState)を呼び出します。あなたのコードは通常の作業を行い、最後にOnEndEvent(counter、currentState)を呼び出します。おそらくあなたのコードはcurrentStateを変更しました。

プロダクションでは、関数デリゲートの空の実装を使用するか、ループでnil checkを実装できます。

このモデルを使用すると、必要に応じて処理アルゴリズムを何回もチェックできます。 5つの小切手があるとします。今、あなたはそれを振り返り、それがとても難しくなっていることを実感します。コールバック関数を定義するインタフェースを作成します。これらのコールバック関数は、サービスの動作を変更する強力な方法です。もう一度やり直して、インターフェイスが実際にあなたの "サービスのポリシー"であることを理解してください;)

あなたが無限ループを何とか止めたいと思うでしょう。テストケース内で厳密な制御が必要な場合は、3回目の関数デリゲートを使用して、ループから終了する時間がtrueの場合はtrueを返します。共有変数は、終了条件を制御するためのオプションです。

これは確かに単体テストよりも高いレベルのテストであり、複雑なサービスでは必要です。

2

はい、可能です。ループ内にあるコードを別の関数に置き、ループなしで機能する単体テストを入れます。

関連する問題