So testen Sie verschachtelte Eingaben in Go

王林
Freigeben: 2024-02-14 12:00:11
nach vorne
991 Leute haben es durchsucht

如何在 Go 中测试嵌套输入

php-Editor Youzi stellt Ihnen vor, wie Sie verschachtelte Eingaben in Go testen. Beim Schreiben von Go-Code stoßen Sie häufig auf Situationen, in denen Sie verschachtelte Eingaben verarbeiten müssen, beispielsweise verschachtelte JSON-Daten oder mehrdimensionale Arrays. Wie diese verschachtelten Eingaben effektiv getestet werden können, ist eine zentrale Frage. Dieser Artikel zeigt Ihnen einige praktische Methoden und Techniken, die Ihnen helfen, verschachtelte Eingaben in Go einfach zu testen und die Korrektheit und Stabilität Ihres Codes sicherzustellen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, werden diese Tipps beim Schreiben und Testen von Go-Code sehr hilfreich sein. Finden wir es gemeinsam heraus!

Frageninhalt

Ich habe die Funktion, mit os.stdin Benutzereingaben einzuholen

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
}

Nach dem Login kopieren

In meinem Programm benötige ich zwei Eingaben:

  • Wird zuerst verwendet, um grundlegende Informationen wie den Benutzernamen zu erhalten
  • Die zweite wird verwendet, um zusätzliche Informationen zu erhalten, die von der ersten Eingabe abhängen
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
}
Nach dem Login kopieren

Ist es möglich, für diese Situation einen Unit-Test zu schreiben? Um eine Benutzereingabe zu testen, habe ich dieses Code-Snippet verwendet und es funktioniert:

    var stdin bytes.Buffer
    stdin.Write([]byte(fmt.Sprintf("%s\n", tt.input)))
    GetInput(stdin)
Nach dem Login kopieren

Aber es funktioniert nicht mit 2 verschachtelten Eingaben

Umgehungslösung

Vielleicht erwägen Sie die Verwendung einer Funktion, die einen bestimmten Ergebnistyp zurückgibt, und packen Sie sie in ein separates Paket.

Da ich gesehen habe, dass nameage ,也许我们可以假设一个具体类型,例如 person zur Klarstellung erwähnt wurde.

Es ist wichtig zu beachten, dass wir den tatsächlichen Leser als Parameter einschließen möchten, anstatt einen fest codierten Verweis auf os.stdin zu haben. Dadurch wird die Simulation verschachtelter Eingaben überhaupt erst möglich.

In diesem Fall könnte die Signatur der Methode so aussehen:

func nestedinput(input io.reader) (*person, error)
Nach dem Login kopieren

Der entsprechende Typ kann sein:

type person struct {
    name string
    age  int
}
Nach dem Login kopieren

Wenn Sie nun Ihre Codeschnipsel zu einer kompletten Go-Datei zusammengeführt haben, in einem separaten Verzeichnis mit dem Namen input.go, könnte das so aussehen:

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
    }
}
Nach dem Login kopieren

q 的输入返回 nil、nil und kann zum Beenden von Eingaben verwendet werden, beispielsweise wenn die Abfrage in einer Schleife erfolgt.

Einheitentests

Einheitentests

func test_nestedinput(t *testing.t)
Nach dem Login kopieren

Die Datei mit dem Namen input_test.go sollte nun die Eingabedaten bereitstellen.

Da nestedinput 函数现在需要 io.reader als Parameter verwendet wird, können wir einfach die erforderliche Eingabe generieren, z. B.

input := strings.newreader("george\n26\n")
Nach dem Login kopieren

Der Test könnte also so aussehen:

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)
    }
}
Nach dem Login kopieren

Natürlich kann der Test um weitere Details erweitert werden. Wie Sie sehen, simuliert dies jedoch eine verschachtelte Eingabe.

Das obige ist der detaillierte Inhalt vonSo testen Sie verschachtelte Eingaben in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage