unit-testing - 我如何对文本将出现在屏幕中央进行单元测试?

标签 unit-testing go

这是一个小脚本。

package bashutil

import (
    "fmt"
    "github.com/nsf/termbox-go"
)

func Center(s string) {
    if err := termbox.Init(); err != nil {
        panic(err)
    }
    w, _ := termbox.Size()
    termbox.Close()
    fmt.Printf(
        fmt.Sprintf("%%-%ds", w/2),
        fmt.Sprintf(fmt.Sprintf("%%%ds", w/2+len(s)/2), s),
    )
}

我可以对其进行单元测试吗?我怎样才能测试它?我认为测试一个片段这么少是胡说八道。但是,...如果我要测试这段代码怎么办?如何测试输出是否与我预期的一样?

我可以测试 fmt 打印出我预期的结果吗?

最佳答案

“测试”是什么意思?

我认为“测试”需要对函数的输出产生影响。

您的函数的输出是 Stdout,因此我们需要先获取输出。

我们可以简单地做到这一点:

func TestCenter(*testing.T) {
    stdoutBak := os.Stdout
    r, w, _ := os.Pipe()
    os.Stdout = w

    Center("hello")
    w.Close()
    os.Stdout = stdoutBak

    // Check output as a byte array
    outstr, _ := ioutil.ReadAll(r)
    fmt.Printf("%s", outstr)
}

因此,您可以检查输出格式、拼写等。

关于unit-testing - 我如何对文本将出现在屏幕中央进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42096238/

相关文章:

python - 如何模拟一个方法并查看它是否被调用?

networking - 如何计算 Go 中的 ESTABLISHED 连接?

go - 关闭终端中的回显 - Golang

go - 如何将 web 模板变量设置为动态 html 和 golang 代码?

arrays - 使用 go 中的范围选择 2D slice 的 2D 子 slice

c++ - 每次都捕获测试框架长链接时间

matlab - 对 Simulink 模型进行集成测试

.net - 为什么 Visual Studio 2015/2017/2019 测试运行程序没有发现我的 xUnit v2 测试

php - 在 Laravel、setUp 和 tearDown 中测试不会回滚我的数据库事务?

string - 在 Go 中比较不等长的字符串