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

Input 如何针对Go中的用户输入编写测试,input,go,Input,Go,如何根据fmt.Scan/Scanf/Scanln中的用户输入进行测试 例如,我如何测试函数输入是否从STDIN接受“45\n”和“1234\n”,并返回n==5和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 arra

如何根据fmt.Scan/Scanf/Scanln中的用户输入进行测试

例如,我如何测试函数输入是否从STDIN接受“45\n”和“1234\n”,并返回n==5和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)
}
主程序包
进口(
“fmt”
)
//input从用户获取一个数组。
func input()(m int,数组[]int){
fmt.Print(“输入数组的大小n和差值m:”)
变量n int
_,err:=fmt.Scanf(“%d%d”,&n,&m)
如果错误!=零{
恐慌(错误)
}
打印(“以空格分隔的字符串形式输入数组:”)
数组=生成([]整数,n)
对于i:=0;i
你不能。至少不那么容易,因此值得付出努力。

这里有一个非常粗略的草案来说明这一原则

程序。开始

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)
}
输出:

$ go test
ok      command-line-arguments  0.010s

那我怎么才能修改我的代码,使它能够以某种形式进行测试呢?你不能这么做。基本上,您不能(至少不能使用合理数量的代码)针对fmt.Scanf编写单元测试。您应该将代码拆分为:1)获取输入。2) 处理输入。为2编写一个测试。上面的示例使用1)操作os.File(可能是os.Stdin)和2)操作此文件的input()函数进行拆分。但是请注意:Peter的答案很聪明,但没有检查fmt.Scanf是否在输入由fmt.Fscanf读取时工作。(我知道这只是一个包装纸)。我仍然认为:您不能针对用户输入编写单元测试。我明白您的意思,但只要您假设Go本身按预期工作,peterSO的解决方案在功能上是等效的。彼得索的解决方案也准确地解决了我的问题,任何分歧都完全是因为我无法恰当地表达我的问题。
$ go test
ok      command-line-arguments  0.010s