首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获函数调用的标准输出

捕获函数调用的标准输出
EN

Code Review用户
提问于 2023-01-05 16:22:41
回答 1查看 431关注 0票数 2

实现这个测试助手函数有什么重大缺陷吗?

我知道,首选的方法(重构)只会使要测试的函数返回其值并将打印委托给另一个部分,但有时必须测试其中的内容。

代码语言:javascript
复制
import (
    "io"
    "os"
)

// captureStdout calls a function f and returns its stdout side-effect as string
func captureStdout(f func()) string {
    // return to original state afterwards
    // note: defer evaluates (and saves) function ARGUMENT values at definition
    // time, so the original value of os.Stdout is preserved before it is changed
    // further into this function.
    defer func(orig *os.File) {
        os.Stdout = orig
    }(os.Stdout)

    r, w, _ := os.Pipe()
    os.Stdout = w
    f()
    w.Close()
    out, _ := io.ReadAll(r)

    return string(out)
}

动机全示例

main.go

代码语言:javascript
复制
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

main_test.go

代码语言:javascript
复制
package main

import (
    "io"
    "os"
    "testing"
)

func Test_main(t *testing.T) {
    want := "Hello, World!\n"
    got := captureStdout(main)
    if got != want {
        t.Errorf("main() = %v, want %v", got, want)
    }
}

// captureStdout calls a function f and returns its stdout side-effect as string
func captureStdout(f func()) string {
    // return to original state afterwards
    // note: defer evaluates (and saves) function ARGUMENT values at definition
    // time, so the original value of os.Stdout is preserved before it is
    // changed further into this function.
    defer func(orig *os.File) {
        os.Stdout = orig
    }(os.Stdout)

    r, w, _ := os.Pipe()
    os.Stdout = w
    f()
    w.Close()
    out, _ := io.ReadAll(r)

    return string(out)
}
EN

回答 1

Code Review用户

发布于 2023-01-10 04:52:04

r, w, \_ := os.Pipe()

为什么我们忽略错误返回?我们真的相信没有办法让管道失效吗?即使在一堆打开的()S没有关闭()?

out, \_ := io.ReadAll(r)

更令人费解的是。阅读错误永远不会发生吗?

对不起,我不能建议以当前状态传送此代码。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/282374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档