dsh1956 2013-07-03 19:49
浏览 59
已采纳

如何在Go中针对用户输入编写测试

How would I test against user input from fmt.Scan/Scanf/Scanln?

For example how could I test that the function input will accept "4 5 " and "1 2 3 4 " from STDIN and return n == 5 and array == [1, 2, 3, 4].

package main

import (
    "fmt"
)

// input gets an array from the user.
func input() (m int, array []int) {
    fmt.Print("Enter the size of the array, n, and the difference, m: ")
    var n int
    _, err := fmt.Scanf("%d %d", &n, &m)
    if err != nil {
        panic(err)
    }

    fmt.Print("Enter the array as a space seperated string: ")
    array = make([]int, n)
    for i := 0; i < n; i++ {
        _, _ = fmt.Scan(&array[i])
    }

    return m, array
}

func main() {
    m, array := input()
    fmt.Println(m, array)
}
  • 写回答

2条回答 默认 最新

  • dongqiongzheng0615 2013-07-03 21:14
    关注

    Here's a very rough draft to illustrate the principle.

    program.go

    package main
    
    import (
        "fmt"
        "os"
    )
    
    // input gets an array from the user.
    func input(in *os.File) (m int, array []int) {
        if in == nil {
            in = os.Stdin
        }
    
        fmt.Print("Enter the size of the array, n, and the difference, m: ")
        var n int
        _, err := fmt.Fscanf(in, "%d %d", &n, &m)
        if err != nil {
            panic(err)
        }
    
        fmt.Print("Enter the array as a space seperated string: ")
        array = make([]int, n)
        for i := 0; i < n; i++ {
            _, _ = fmt.Fscan(in, &array[i])
        }
    
        return m, array
    }
    
    func main() {
        m, array := input(nil)
        fmt.Println(m, array)
    }
    

    program_test.go

    package main
    
    import (
        "fmt"
        "io"
        "io/ioutil"
        "os"
        "testing"
    )
    
    func TestInput(t *testing.T) {
        var (
            n, m  int
            array []int
        )
    
        in, err := ioutil.TempFile("", "")
        if err != nil {
            t.Fatal(err)
        }
        defer in.Close()
    
        _, err = io.WriteString(in, "4 5
    "+"1 2 3 4
    ")
        if err != nil {
            t.Fatal(err)
        }
    
        _, err = in.Seek(0, os.SEEK_SET)
        if err != nil {
            t.Fatal(err)
        }
    
        n, array = input(in)
        if n != 5 || fmt.Sprintf("%v", array) != fmt.Sprintf("%v", []int{1, 2, 3, 4}) {
            t.Error("unexpected results:", n, m, array)
        }
    }
    

    Output:

    $ go test
    ok      command-line-arguments  0.010s
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用