🙆

テスト用のファクトリメソッド

2022/09/13に公開

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に

そんな中、こちらの記事を読んで、正規パッケージでありながら、ビルド時には無視される手法を見かけました。
これだと思いましたが、テスト用パッケージのときと同じく、テスト用のファイルは、自分がテスト用のファイルであろうとインポートができません。

最後に

やっぱりビルドタグ
これで、ファクトリメソッドはテスト時にだけ、ビルドされるので、誤用の心配がなくなりました。

参考: ライブコーディングで理解するDDDのテスト (DDD勉強会2021#2)

Discussion