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