main()
func main() {
Double(os.Stdin, os.Stdout)
}
I/O に依存したプログラムのユニットテスト
StringIO
を使う
def test_double
stdin = StringIO.new("hoge\n", "r")
stdout = StringIO.new("", "w")
double(stdin, stdout)
assert_equal("hoge\nhoge\n", stdout.string)
end
Python にも同名で同じような用途のクラスが存在
bytes.Buffer
を使う
[]byte
にいろんなメソッドが生えたような構造体[]byte
や string
を元に生成することができるio.ReadWriter
インターフェイスを満たすtype ReadWriter interface {
Reader
Writer
}
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
os.File
, net.TCPConn
, net.UnixConn
などはこれらを満たしている。
$ echo hoge | go run double.go
hoge
hoge
func main() {
Double(os.Stdin, os.Stdout)
}
func Double(stdin io.Reader, stdout io.Writer) {
buf, _ := ioutil.ReadAll(stdin)
stdout.Write(buf)
stdout.Write(buf)
}
func TestDouble(t *testing.T) {
stdin := bytes.NewBufferString("hoge\n")
stdout := new(bytes.Buffer)
Double(stdin, stdout)
if stdout.String() != "hoge\nhoge\n" {
t.Fatal("Not matched")
}
}
def test_double
stdin = StringIO.new("hoge\n", "r")
stdout = StringIO.new("", "w")
double(stdin, stdout)
assert_equal("hoge\nhoge\n", stdout.string)
end
*os.File
ではなく io.Reader
や io.Writer
に依存するBuffer.Bytes()
や Buffer.String()
で中身を取り出して検査する
string
なり []byte
なりの流儀に従って比較を行うexec.Cmd
の標準入出力を差し替えてコマンドの E2E テスト
func TestCommand(t *testing.T) {
cmd := exec.Command("go", "run", "double.go")
cmd.Stdin = bytes.NewBufferString("hoge\n")
stdout := new(bytes.Buffer)
cmd.Stdout = stdout
_ = cmd.Run()
if stdout.String() != "hoge\nhoge\n" {
t.Fatal("Not matched")
}
}