テスト用のファクトリメソッド
Go言語のテスト用のファクトリメソッド
松岡さんの書籍や、YouTubeを参考にコーディングをしていると、GO言語だとどう書くのかなと、止まることがあります。
その一つが、テスト用のファクトリメソッドです。
調べればデザインパターンを使った、デフォルト引数の実装の仕方も分かりますし、メソッドを書くこと自体は、難しくありません。
問題は、テスト専用にしたいという部分でした。
結論は別パッケージ
(2022/10/5 追記)
対象の構造体のパッケージの子パッケージに、ファクトリメソッドを定義します。
行きついた結果は、何ともひねりのない物になりました。
この方法だと、テストビルドだけではなく、正規ビルドにもインポートできてしまう危険性がありますが、運用で回避する事にしました。
ビルドタグで分ける
ビルドタグで切り分ける方法です。
開発にvscodeを使っていると、ファクトリメソッドの呼び出し側がエラーになるので、あまりやりたくなかったのですが、仕方がありません。
ファクトリメソッドを定義を1つのファイルにまとめ、ファイルの先頭にビルドタグをつけます。
今回は"factory"です。
パッケージ名は、正規パッケージ名にしておきます。
//go:build factory
// +build factory
package sample
開発は、vscodeを使用しているので、次の設定を付け加えます。
"go.testTags": "factory"
パッケージ名を〇〇〇_testに
結論に行きつくまでに、少し試行錯誤しました。
始めは、〇〇〇_testパッケージに記述したのですが、これはうまくいきませんでした。
ファクトリメソッドが、そのテストパッケージでしか使われないのなら良かったのですが、〇〇〇_testパッケージは、他からインポートできなません。
オニオンアーキテクチャの様な設計を採用していると、幾つかのパッケージで構造体を使う場面があるので、これでは都合が悪すぎます。
正規のパッケージで ファイル名を〇〇〇_test.goに
そんな中、こちらの記事を読んで、正規パッケージでありながら、ビルド時には無視される手法を見かけました。
これだと思いましたが、テスト用パッケージのときと同じく、テスト用のファイルは、自分がテスト用のファイルであろうとインポートができません。
最後に
やっぱりビルドタグ
これで、ファクトリメソッドはテスト時にだけ、ビルドされるので、誤用の心配がなくなりました。
Discussion