$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Hatena-Textbook 2018 学習日記(4)

Hatena-Textbook 2018 学習日記(3) - $shibayu36->blog;の続き。

https://github.com/shibayu36/go-Intern-Diary/pull/2 で、ダイアリー作成とダイアリー一覧まで作った。記事作成系は出来てないけど、とりあえずここまでやれば次のGraphQLやReactあたりの学習ができるはず。

次のようなことが学習できてよかった。

  • jmoiron/sqlx の使い方
  • goのテストのやり方いろいろ
  • monkey.Patchによるメソッド置き換え

jmoiron/sqlx の使い方

最初はgodocの https://godoc.org/github.com/jmoiron/sqlx の方を読んでいたら全く分からなかったのだが、途中でgithubのREADME.mdを見れば良いことが分かってようやく使い方がわかった感じ。より詳しい使い方を知るには http://jmoiron.github.io/sqlx/https://github.com/jmoiron/sqlx/blob/master/sqlx_test.go を見ると良い。

ちなみにsqlxのコードを軽く読んでて面白いなーと思ったのは https://github.com/jmoiron/sqlx/blob/38398a30ed8516ffda617a04c822de09df8a3ec5/sqlx.go#L876..L985 あたり。reflexで代入先の変数の型を見ながら、SELECTの結果をいい感じに代入してくれる。すごい。

goのテストのやり方いろいろ

次の資料がいろいろ参考になった。


一つ分からなかったことがある。実装したドメインロジックを使ってテストデータ作成用テストユーティリティを作るときに、どこに置けばよいかが分からない。

例えばテスト用にCreateTestUserというメソッドを作るとして、このメソッドはservice.CreateNewUserという本番でも使うメソッドを使って実装したい。この時

  • testutil/testutil.goの中にCreateTestUserを置くと、service/service_test.goみたいなところでCreateTestUserを使ったときにimport cycle not allowedのエラーが出てしまう
  • service/service_test.goにCreateTestUserを置くと、service package以外から参照できない。例えばweb/web_test.goからCreateTestUserが使えない
  • service/testutil.goみたいなところに置くと、この関数をテスト以外でも使えてしまって事故りそう

ということで置き場所が分からない。testing - import cycle in golang with test packages - Stack Overflowのコメント欄でも困っている様子だが、答えが出ていない。

どうすれば良いかご意見募集。

monkey.Patchによるメソッド置き換え

bou.ke/monkey.Patchを使うと、メソッドを置き換えられるようだ。いろいろ使い道ありそう。例えば https://github.com/tkuchiki/faketime/blob/master/faketime.go ではテスト時に時刻をfakeするためmonkey.Patchを使っている。