我有一個產生輸出到 os.Stdout 的函式,我想對它進行單元測驗。如何將輸出捕獲到可以在單元測驗中進行比較的字串中?
func f() {
// How to capture "hello\n"?
fmt.Fprintln(out, "hello")
}
uj5u.com熱心網友回復:
經典測驗用例方法
撰寫您的函式以采用默認為標準輸出的可選 io.Writer,但允許您傳入 io.Writer。這將使您能夠將所有輸出捕獲到可用于測驗用例的 bytes.Buffer 中。
// f writes to stdout, or to an io.Writer if passed in.
func f(fd ...io.Writer) {
var out io.Writer
switch len(fd) {
case 0:
out = os.Stdout
case 1:
out = fd[0]
default:
panic("called with too many parms")
}
fmt.Fprintln(out, "hello")
}
當您呼叫不帶引數的函式時,您會得到通常預期的寫入標準輸出的操作。
f() // Writes to stdout
為了測驗,傳遞一個 bytes.Buffer。當函式回傳時,緩沖區將包含函式寫入的輸出,準備好進行測驗。
var b bytes.Buffer // capture output in b
f(&b)
fmt.Printf("<%s>\n", b.String())
這種方法的另一個好處是,如果需要,該函式現在可以輕松地寫入到 stdout 以外的目標。
游樂場:https ://go.dev/play/p/3Kn_ht3ylE-
uj5u.com熱心網友回復:
一種選擇是使用os.Pipe,并使用os.Stdout. 一個問題是os.Stdout在并發情況下可能會捕獲/恢復競爭條件,但是,出于測驗目的,它可能是可以的。
func main() {
storeStdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w
// call f()
// for example just print hello
fmt.Println("hello")
w.Close()
out, _ := io.ReadAll(r)
// restore the stdout
os.Stdout = storeStdout
fmt.Printf("Got result: %s", out)
}
操場
相關:請注意log.SetOutput()可用于捕獲日志記錄輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529457.html
標籤:去测试
上一篇:我想將我自己的隨機函式與std::shuffle一起使用,但它不起作用
下一篇:如何在測驗環境中初始化存盤庫?
