Rumah > pembangunan bahagian belakang > Golang > Cara menguji input bersarang dalam Go

Cara menguji input bersarang dalam Go

王林
Lepaskan: 2024-02-14 12:00:11
ke hadapan
1064 orang telah melayarinya

如何在 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
}

Salin selepas log masuk

在我的程序中,我需要有 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
}
Salin selepas log masuk

是否可以为这种情况编写单元测试? 为了测试一个用户输入,我使用了这个代码片段,它有效:

    var stdin bytes.Buffer
    stdin.Write([]byte(fmt.Sprintf("%s\n", tt.input)))
    GetInput(stdin)
Salin selepas log masuk

但它不适用于 2 个嵌套输入

解决方法

也许可以考虑使用一个返回特定类型结果的函数并将其放入单独的包中。

由于我看到提到了 nameage ,也许我们可以假设一个具体类型,例如 person 来进行说明。

需要注意的是,我们希望将实际的阅读器作为参数包含在内,而不是对 os.stdin 进行硬编码引用。这使得嵌套输入的模拟首先成为可能。

这样,方法的签名可能如下所示:

func nestedinput(input io.reader) (*person, error)
Salin selepas log masuk

对应的类型可以是:

type person struct {
    name string
    age  int
}
Salin selepas log masuk

如果现在将您的代码片段合并到一个完整的 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
    }
}
Salin selepas log masuk

q 的输入返回 nil、nil 并可用于终止输入,例如如果查询是在循环中进行的。

单元测试

单元测试

func test_nestedinput(t *testing.t)
Salin selepas log masuk

名为 input_test.go 的文件现在应该提供输入数据。

由于 nestedinput 函数现在需要 io.reader 作为参数,因此我们可以简单地生成所需的输入,例如,

input := strings.newreader("george\n26\n")
Salin selepas log masuk

所以测试可能看起来像这样:

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)
    }
}
Salin selepas log masuk

当然,可以通过更多细节来扩展测试。但是,正如您所看到的,这模拟了嵌套输入。

Atas ialah kandungan terperinci Cara menguji input bersarang dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan