4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Goで標準入力している処理をテストしたい

Posted at

自分メモとして

Goで下記のように標準入力からの入力待ちの処理をテストしたい時ってどうすりゃいいのかなってことで調べてみた

var sc = bufio.NewScanner(os.Stdin)
if sc.Scan() {
	var txt = sc.Text()
}

そもそも os.Stdin 直接渡さず、 bufio.NewScannerio.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)

ざっくりとですが、こんな感じになります


余談

ちょっとした処理でも、テスト書く前提でコーディングするようにしないと後々面倒なことになるんで気をつけなければー

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?