我有一個應用程序(epazote),一旦啟動就會永遠運行,但我想在它阻塞/等待直到ctrl+c被按下或被殺死之前測試一些值。這是一個小例子:http : //play.golang.org/p/t0spQRJB36package mainimport ( "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或 a 時kill -HUP,我在想可能會創建一個假的,signal.Notify但不知道如何覆蓋導入的包,以防萬一。
2 回答

揚帆大魚
TA貢獻1799條經驗 獲得超9個贊
將測試委托引入您的代碼。
將您的循環提取到一個函數中,該函數接受 2 個函數作為參數:onBeginEvent 和 onEndEvent。函數簽名應采用:
聲明您要在測試用例中檢查
可選:循環編號的計數器(因此您可以識別每個循環)。它是可選的,因為實際的委托實現可以計算它被自身調用的次數。
在循環開始時,您調用 OnBegingEvent(counter, currentState); 比您的代碼完成其正常工作,最后您調用 OnEndEvent(counter, currentState); 大概你的代碼已經改變了 currentState。
在生產中,您可以使用函數委托的空實現或在循環中實現 nil 檢查。
您可以使用此模型根據需要對處理算法進行盡可能多的檢查。假設您有 5 張支票。現在你回過頭來看它并意識到這變得太難了。您創建一個接口來定義您的回調函數。這些回調函數是改變服務行為的強大方法。你再退一步,意識到接口實際上是你的“服務策略”;)
一旦你走那條路,你就會想以某種方式停止你的無限循環。如果您想在測試用例中進行嚴格控制,您可以采用第三個函數委托,如果需要退出循環,該委托將返回 true。共享變量是控制退出條件的選項。
這當然是比單元測試更高級別的測試,并且在復雜的服務中是必要的。
- 2 回答
- 0 關注
- 175 瀏覽
添加回答
舉報
0/150
提交
取消