gpt4 book ai didi

testing - 填充os.Stdin以读取其中的函数

转载 作者:行者123 更新时间:2023-12-01 22:23:03 25 4
gpt4 key购买 nike

如何在我的测试中填写os.Stdin中是否有使用扫描仪从中读取的功能?

我要求使用以下功能通过扫描仪输入用户命令行:

func userInput() error {
scanner := bufio.NewScanner(os.Stdin)

println("What is your name?")
scanner.Scan()
username = scanner.Text()

/* ... */
}

现在如何测试这种情况并模拟用户输入?
以下示例不起作用。 Stdin还是空的。
func TestUserInput(t *testing.T) {
var file *os.File
file.Write([]byte("Tom"))
os.Stdin = file

err := userInput()
/* ... */
}

最佳答案

模拟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: Tom
PASS

另请参阅有关模拟文件系统的相关问题: Example code for testing the filesystem in Golang

简单的首选方法

还要注意,您可以将 userInput()重构为不从 os.Stdin读取,而是可以接收到 io.Reader进行读取。这将使其更健壮并且更容易测试。

在您的应用中,您可以简单地将 os.Stdin传递给它,而在测试中,您可以将任何 io.Reader传递给它在测试中创建/准备的代码,例如使用 strings.NewReader() bytes.NewBuffer() bytes.NewBufferString()

关于testing - 填充os.Stdin以读取其中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61818006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com