os.Stdin
您在正确的位置上,
os.Stdin该变量是
*os.File您可以修改的(类型为),可以在测试中为其分配新值。
最简单的方法是使用您要模拟的内容作为输入创建一个临时文件
os.Stdin。要创建临时文件,请使用
ioutil.TempFile()。然后将内容写入其中,并返回到文件的开头。现在,您可以将其设置为
os.Stdin并执行测试。不要忘记清理临时文件。
我将您修改
userInput()为:
func userInput() error { scanner := bufio.NewScanner(os.Stdin) fmt.Println("What is your name?") var username string if scanner.Scan() { username = scanner.Text() } if err := scanner.Err(); err != nil { return err } fmt.Println("Entered:", username) return nil}
这就是您可以测试的方式:
func TestUserInput(t *testing.T) { content := []byte("Tom") tmpfile, err := ioutil.TempFile("", "example") if err != nil { log.Fatal(err) } defer os.Remove(tmpfile.Name()) // clean up if _, err := tmpfile.Write(content); err != nil { log.Fatal(err) } if _, err := tmpfile.Seek(0, 0); err != nil { log.Fatal(err) } oldStdin := os.Stdin defer func() { os.Stdin = oldStdin }() // Restore original Stdin os.Stdin = tmpfile if err := userInput(); err != nil { t.Errorf("userInput failed: %v", err) } if err := tmpfile.Close(); err != nil { log.Fatal(err) }}
运行测试,我们看到一个输出:
简单,首选的方式What is your name?Entered: TomPASS
另请注意,您可以重构
userInput()为不读取
os.Stdin,但是可以接收
io.Reader到读取的内容。这将使它更健壮并且更容易测试。
在您的应用程序,你可以简单地传递
os.Stdin给它,并在测试中,你可以通过任何
io.Reader它创建/在测试准备,例如使用
strings.NewReader(),
bytes.NewBuffer()或
bytes.NewBufferString()。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)