php小編柚子為您介紹如何在 Go 中測試巢狀輸入。在編寫 Go 程式碼時,經常會遇到需要處理巢狀輸入的情況,例如巢狀的 JSON 資料或多維數組。如何有效地測試這些嵌套輸入是一個關鍵問題。本文將向您展示一些實用的方法和技巧,幫助您在 Go 中輕鬆測試嵌套輸入,並確保程式碼的正確性和穩定性。無論您是初學者還是有經驗的開發者,這些技巧都將對您在編寫和測試 Go 程式碼時非常有幫助。讓我們一起來了解吧!
我有使用 os.stdin
取得使用者輸入的功能
func (i input) getinput(stdin io.reader) (string, error) { reader := bufio.newreader(stdin) data, err := reader.readstring('\n') if err != nil { return "", fmt.errorf("get input error: %w", err) } return strings.replaceall(data, "\n", ""), nil }
在我的程式中,我需要有 2 個輸入:
name,err := getinput(os.stdin) if err != nil { // error handling..... } switch name { case "test": //do something... age, err := getinput(os.stdin) if err != nil { // error handling..... } fmt.println(age) case "another": // here another input }
是否可以為這種情況編寫單元測試? 為了測試一個使用者輸入,我使用了這個程式碼片段,它有效:
var stdin bytes.Buffer stdin.Write([]byte(fmt.Sprintf("%s\n", tt.input))) GetInput(stdin)
但它不適用於 2 個巢狀輸入
也許可以考慮使用一個返回特定類型結果的函數並將其放入單獨的套件中。
由於我看到提到了 name
和 age
,也許我們可以假設一個具體類型,例如 person
來進行說明。
要注意的是,我們希望將實際的閱讀器作為參數包含在內,而不是對 os.stdin
進行硬編碼參考。這使得嵌套輸入的模擬首先成為可能。
這樣,方法的簽章可能如下所示:
func nestedinput(input io.reader) (*person, error)
對應的型別可以是:
type person struct { name string age int }
如果現在將您的程式碼片段合併到一個完整的 go 文件,並在一個單獨的目錄中使用名稱 input.go
,它可能看起來像這樣:
package input import ( "bufio" "fmt" "io" "strconv" "strings" ) func getinput(reader *bufio.reader) (string, error) { data, err := reader.readstring('\n') if err != nil { return "", fmt.errorf("get input error: %w", err) } return strings.replaceall(data, "\n", ""), nil } type person struct { name string age int } func nestedinput(input io.reader) (*person, error) { reader := bufio.newreader(input) name, err := getinput(reader) if err != nil { return nil, err } switch name { case "q": return nil, nil default: agestr, err := getinput(reader) if err != nil { return nil, err } age, err := strconv.atoi(agestr) if err != nil { return nil, err } return &person{name: name, age: age}, nil } }
q
的輸入回傳 nil、nil
並可用於終止輸入,例如如果查詢是在循環中進行的。
單元測試
單元測試
func test_nestedinput(t *testing.t)
名為 input_test.go
的檔案現在應該提供輸入資料。
由於 nestedinput
函數現在需要 io.reader
作為參數,因此我們可以簡單地產生所需的輸入,例如,
input := strings.newreader("george\n26\n")
所以測試可能看起來像這樣:
package input import ( "strings" "testing" ) func Test_nestedInput(t *testing.T) { input := strings.NewReader("George\n26\n") person, err := NestedInput(input) if err != nil { t.Error("nested input failed") } if person == nil { t.Errorf("expected person, but got nil") return } if person.Name != "George" { t.Errorf("wrong name %s, expected 'George'", person.Name) } if person.Age != 26 { t.Errorf("wrong age %d, expected 26", person.Age) } }
當然,可以透過更多細節來擴展測試。但是,正如您所看到的,這模擬了嵌套輸入。
以上是如何在 Go 中測試嵌套輸入的詳細內容。更多資訊請關注PHP中文網其他相關文章!