首頁 > 後端開發 > Golang > 主體

如何在 Go 中測試嵌套輸入

王林
發布: 2024-02-14 12:00:11
轉載
992 人瀏覽過

如何在 Go 中测试嵌套输入

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 個巢狀輸入

解決方法

也許可以考慮使用一個返回特定類型結果的函數並將其放入單獨的套件中。

由於我看到提到了 nameage ,也許我們可以假設一個具體類型,例如 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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板