2018-06-24

Last Update:2018/06/24

Go言語によるWebアプリケーション開発 写経中

Go言語のtesting パッケージによるテストコード

package trace

import (
    "bytes"
    "testing"
)

func TestNew(t *testing.T) {
    var buf bytes.Buffer
    tracer := New(&buf)
    if tracer == nil {
            t.Error("Newからの戻り値がnilです.")
    } else {
            tracer.Trace("こんにちは、trace パッケージ")
            if buf.String() != "こんにちは、trace パッケージ\n" {
                    t.Errorf("'%s'という誤った文字列が出力されました", buf.String())
            }
    }
}

テスト対象

package trace

import (
    "fmt"
    "io"
)

// Tracer型のinterfaceを定義する
// TracerはTraceのinterfaceを持つ関数がある
type Tracer interface {
    Trace(...interface{})
}

type tracer struct {
    out io.Writer
}

// Tracerのオブジェクトを新しく作る
// オブジェクトは実際にはtracer で規定される
// 戻り値はTracer型であるので、tracer.Traceという関数が存在する
func New(w io.Writer) Tracer {
    return &tracer{out: w}
}

// tracer型のTraceの実装
// tracer型にはTraceというinterfaceを引数として受け取る関数を定義してやる
// 引数は0個でも、何個でも受け取れる
func (t *tracer) Trace(a ...interface{}) {
    t.out.Write([]byte(fmt.Sprint(a...)))
    t.out.Write([]byte("\n"))
}