TTIL

2021-12-08 MySQLはひどいデータベース? / Goで標準出力をテストする方法

MySQLはひどいデータベース?

Twitter で見た話題。

Goで標準出力をテストする方法 - Qiita

captureStdout ヘルパー関数

package main

import (
    "bytes"
    "io"
    "os"
)

func captureStdout(f func()) string {
    r, w, err := os.Pipe()
    if err != nil {
        panic(err)
    }

    stdout := os.Stdout
    os.Stdout = w

    f()

    os.Stdout = stdout
    w.Close()

    var buf bytes.Buffer
    io.Copy(&buf, r)

    return buf.String()
}

テスト部

package main

import "testing"

func TestRun(t *testing.T) {
    var code int

    out := captureStdout(func() {
        code = run([]string{"-x", "2", "-y", "3"})
    })

    if code != ExitCodeOK {
        t.Errorf("Unexpected exit code: %d", code)
    }

    if out != "2 + 3 = 5\n" {
        t.Errorf("Unexpected output: %s", out)
    }
}