栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

嘲笑
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()



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/377060.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号