自分メモとして
Goで下記のように標準入力からの入力待ちの処理をテストしたい時ってどうすりゃいいのかなってことで調べてみた
var sc = bufio.NewScanner(os.Stdin)
if sc.Scan() {
var txt = sc.Text()
}
そもそも os.Stdin
直接渡さず、 bufio.NewScanner
に io.Reader
渡せばいいんですが、、、
まぁ、それができない状況と察してください
os.Stdin 差し替える
スマートではないですが、多分このやり方がサクッとできそうです
os.Stdin は下記のように定義してあります
package os
~~ 省略 ~~
var (
Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)
Stdin を io.Reader
を実装しているオブジェクトに差し替えてやります
// 一時ファイル作成
tmp, _ := ioutil.TempFile("", "tmp")
orgStdin := os.Stdin
os.Stdin = tmp
defer func () {
os.Remove(tmp.Name())
os.Stdin = orgStdin
}()
tmp.Write([]byte("なにかしらの入力")
// 読み書き位置を先頭に
tmp.Seek(0, 0)
ざっくりとですが、こんな感じになります
余談
ちょっとした処理でも、テスト書く前提でコーディングするようにしないと後々面倒なことになるんで気をつけなければー