aferoを使ってGoでのファイル生成のUnitTestを書きやすくする
Go言語の永遠の初心者です。 自分用の便利スクリプトを用意するときにシェルスクリプトではなくGoを使うときのTIpsです。 Goでファイル生成するときによく使っているライブラリを紹介します。
TL;DR
- aferoを使うことでファイル生成のUnitTestが書きやすくなる
背景
Goでスクリプトを書いていてある程度処理をしてからファイルを生成することがあると思います。 ただスクリプトでの条件が増えてきたりするとそこからUnitTestsが書きたくなることがあると思います。 osライブラリを使うとファイルが作れるのですが... テストのタイミングでは現物のファイルを作るのではなく、 メモリ上でファイルを展開できるといいなーと思うことが多いですよね。
今回紹介するライブラリ
背景
のところで説明した話はこのライブラリを使うと行うことができます。
github.com
install
$ go get github.com/spf13/afero
使い方の例
import "github.com/spf13/afero" // os packagと同じように扱える AppFs := afero.NewOsFs() MakeEmptyFile(AppFs, fileName) func MakeEmptyFile(fs afero.Fs, s string) { dirName := filepath.Dir(s) exists, err := afero.DirExists(fs, dirName) if !exists && err != nil { mkdirErr := fs.MkdirAll(dirName, os.ModePerm) if err != nil { log.Fatal(mkdirErr) } } emptyFile, err := fs.Create(s) if err != nil { log.Fatal(err) } emptyFile.Close() }
テストの例
func TestMakeEmptyFile(t *testing.T) { // テスト用にメモリ上でFSのmockを扱う AppFs := afero.NewMemMapFs() fileName := "./test.py" // メモリ上で扱ってくれるのでファイル本体ができることはない. MakeEmptyFile(AppFs, fileName) // でもUnitTestは実行可能 // file exists exists, _ := afero.Exists(AppFs, fileName) assert(t, exists, true) // file is empty bytes, _ := afero.ReadFile(AppFs, fileName) assert(t, string(bytes), "") } func assert(t *testing.T, actual, expected interface{}) { if actual != expected { t.Errorf("got: %v\nwant: %v", actual, expected) } }
まとめ
osパッケージと同じ使い方ができるのでaferoに切り替えるのは非常に簡単です。 つまりやめたくなったら元に戻すのも簡単です。 UnitTestsもやりやすくなるのでぜひ皆様も使ってみてください。