前回はFactoriesクラスを作ってFakeとSqlSeverのクラスを切り替えられるようにしました。これでデバッグは非常にやりやすくなりましたが,問題が一つあります。それはFakeのままアプリケーションがリリースされる危険性です。
間違ってFakeがリリースされないようにする
Fakeという考え方はテストをする上では非常に有効ですが,お客さんの手にFakeが渡ってしまっては大変です。大問題ですね。完全に機能しないアプリケーションになってしまいます。そうならないような仕組みづくりが必要です。
デバッグとリリース
VisualStudioのツールバーにはDebugとRelease(デバッグとリリース)を切り替える項目があります。これは何のためにあるかというと,お客さんにリリースするアプリケーションはリリースでコンパイルしたものを提供し,我々プログラマーがテストする場合はDebugモードでコンパイルすることで,その時だけ通るロジック等を書いておくことができるという事です。
要するに,製品はリリース版でリリースし,デバッグ的にどうしても書きたいことがあるなら,デバッグモードの時のみ通過するように実装することで,デバッグをやりやすくすることができます。今回で言うと,Fakeのロジックがデバッグの時しか通ってほしくないロジックなので,この部分をデバッグでしか通らないようにしたいと思います。
シャープIfデバッグを使う
C#では「”#if DEBUG」と書くことで,デバッグモードの時のみ通過するロジックを書くことができます。IsFakeでの判断がデバッグモードの時しか通過しないようにするには,次のように記述します。
using NDDD.Domain; using NDDD.Domain.Ripositories; using NDDD.Infrastructure.Fake; using NDDD.Infrastructure.SqlServer; namespace NDDD.Infrastructure { public static class Factories { public static IMeasureRepository CreateMeasure() { #if DEBUG if (Shared.IsFake) { return new MeasureFake(); } #endif return new MeasureSqlServer(); } } }
シャープifDEBUGからシャープendifまでがデバッグモードの時しか通過しないコードになります。このようにしておけば,リリースモードでコンパイルしている限り,IsFakeのフラグがTrueでもFalseでも,Fakeクラスは作成されなくなります。
ツールバーのDebugとReleaseをReleaseにすると通らないロジックがグレーアウトされることが確認できます。
デバッグモードの時はFakeの生成ロジックも通ることが確認できます。
最終的にリリースモードでコンパイルすることが重要ですが,Factoriesをすべてチェックし,Fakeがリリースされる状態になっていないかをチェックすることが必要です。SharedのIsFakeフラグを参照するときに,Releaseモードの時は例外を通知するようにすると,より確実にリリースされないようにすることができます。