はじめに
あるメソッドやWidget
をテストしたい時は、それらがtest
フォルダから参照できるようにするためにpublic
にする必要があります。
しかし、unitテスト
のためにメソッドをprivate
からpublic
に変更して外部から参照できるようにするのは、安全性が低くなってしまい微妙です。
また、Widget
をコンポーネントとして切り出すときは、基本的にprivate
にしますが、これもテストのためにpublic
にするのはあまり良い手段だとは言えません。
このような悩みを解決するのが@visibleForTesting
です。
@visibleForTestingって?
公式ページでは以下のように記載されています。
Used to annotate a declaration that was made public, so that it is more visible than otherwise necessary, to make code testable.
Tools, such as the analyzer, can provide feedback if the annotation is associated with a declaration not in the lib folder of a package, or a private declaration, or a declaration in an unnamed static extension, or the declaration is referenced outside of its defining library or a library which is in the test folder of the defining package.
簡単に要約すると以下の通りです。
コードをtestableにするアノテーションやで💪
@visibleForTestingを付ければ、定義されたもの(関数やクラスなど)が定義ファイル、もしくはtest
フォルダ外から参照された場合、analyzer
がフィードバック(警告)出すぜ!って感じです。
つまり、このアノテーションをつけることで、テストのためにpublic
にしたメソッドやWidget
が他ファイルから参照されるのを防ぐことができます。
これでtest
のためにprivate
からpublic
に変更したコードが他ファイルから使われることを防げそうですね!
使用例
toMap
メソッドをテストするためにpublic
にした例を示します。
|
|
上記のコードでは、@visibleForTesting
アノテーションを付けているので他ファイルから参照すると以下のような警告が出ます。
警告は無視できるじゃないか
ここで一点問題があります。
そうです、警告は無視できちゃうんです。できればwarning
ではなくerror
を出すようにしてビルドできないようにしたいですね。
そんな時は、Dart analysis
の機能を活用します。
analysis_options.yaml
に以下を記述するだけです。
|
|
これで警告がコンパイルエラーに変わりました🎉
まとめ
@visibleForTesting
アノテーションを使うことで不必要なコードの参照を検出できて便利。
また、Dart analysis
の機能を活用することで、警告をコンパイルエラー変更することができて素晴らしい💪