unit-testing - 如何对 CLI 输出进行单元测试

标签 unit-testing go testing

<分区>

我在开发一个小型 CLI 应用程序。我正在尝试编写单元测试。我有一个函数可以使用 fmt.Println/fmt.Printf 将一些输出作为表格呈现给命令行。我想知道如何在单元测试中捕获该输出以确保我得到预期的结果?下面只是一个准系统框架,在某种程度上代表了我正在努力实现的目标。

main.go

package main

import (
    "fmt"
    "io"
)

func print() {
    fmt.Println("Hello world")
}

func main() {
    print()
}

main_test.go

package main

import "testing"

func TestPrint(t *testing.T) {
    expected := "Hello world"
    print() // somehow capture the output
    // if got != expected {
    //  t.Errorf("Does not match")
    // }
}

我尝试了一些方法,例如 How to check a log/output in go test?但运气极差,但这可能是由于我的误解。

最佳答案

您必须以某种方式注入(inject)目标写入器。

您的 API 不够完善,因为它不允许注入(inject)。

在此修改后的代码中,目标编写器作为参数给出,但其他 API 实现决策也是可能的。

package main

import (
    "fmt"
    "io"
)

func print(dst io.Writer) {
    fmt.Fprintln(dst, "Hello world")
}

func main() {
    print(os.Stdout)
}

你可以测试一下

package main

import "testing"

func TestPrint(t *testing.T) {
    expected := "Hello world"
    var b bytes.Buffer    
    print(&b) // somehow capture the output
    // if b.String() != expected {
    //  t.Errorf("Does not match")
    // }
}

bytes.Buffer 实现了 io.Writer 并且可以用作 stub 来捕获执行结果。

https://golang.org/pkg/bytes/#Buffer

关于unit-testing - 如何对 CLI 输出进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58504979/

相关文章:

c# - 如何让 VS 忽略 Test dll 的代码覆盖率

android - Activity 的视觉测试

go - 将C结构从主要golang代码传递到不同的golang程序包中

java - 如何从 JerseyTest 子类访问 Spring Bean

javascript - mocha - 重试整个测试

node.js - Mocha 未显示所有测试

java - java/静态模拟中静态调用中创建的对象

macos - 安装 Google Go 和 App Engine SDK 的正确方法是什么?

oauth - gosimple/oauth2 和谷歌 OAuth2

泛型方法的 c# 单元测试