質問
データベースアプリケーションで私が現在取り組んでいるのは、すべての種類の設定をデータベースです。が、これらの設定があるのカスタマイズの特定の事業規則があるものもあります。
このアプリを含むオブジェクトの具体的な特定の課題など、複雑な計算します。なお、UIオブジェクトはユニット試験が必要なアクセスが盛りだくさんのグローバルを設定します。の方までに実施して、現在ではを含め厳正に対処するとともに物性、応用コントローラーで行います。テスト時に、オブジェクトを作成し、試験および記入値試験(データベースから).
この作品より、いずれの場合もよりすべてのそれらのオブジェクトの必要なグローバル 設定 オブジェクト---もちろんのこと効果的でユニット検査不可能な)不利にできることをおすすめの設定する必要は十数特性、またはする必要がありましょう、そして'覚"をサブオブジェクト。
なので、一般の質問は、:いまアクセスを提供するグローバルアプリケーションの設定にプロジェクトの必要なく、グローバル変数にしながら、ユニットテストコードについて教えてください。でなければならない問題が解決100の回---
(注:いすぎの経験豊富なプログラマーとしてださい;か得!もちろん、私はこの研究はこの課題でしたが、私は本当に一部で、経験豊か)
解決
を使用できるマルティンFowlers ServiceLocatorパターンです。Phpできていれば次のようになるはずです:
class ServiceLocator {
private static $soleInstance;
private $globalSettings;
public static function load($locator) {
self::$soleInstance = $locator;
}
public static function globalSettings() {
if (!isset(self::$soleInstance->globalSettings)) {
self::$soleInstance->setGlobalSettings(new GlobalSettings());
}
return self::$soleInstance->globalSettings;
}
}
生産コードを初期化し、サービスロケータのようになります:
ServiceLocator::load(new ServiceLocator());
でのテストコードは、本サイトのサービスをモックアップ設定のようになります:
ServiceLocator s = new ServiceLocator();
s->setGlobalSettings(new MockGlobalSettings());
ServiceLocator::load(s);
このリポジトリのためのsingletonsと交換できる試験。
他のヒント
うのがモデル私の設定にアクセスのサービスロケータのパターンです。この与えられることになるシングルポイントを任意の設定値を必要とすることをくことで、アプリケーションの外部別の図書館での再利用が可能であり、testability.ここではサンプルコードでは、までお問い合わせください言語を使用すが、書いたのでクライアントまで、フルのC#.
最初に作成します汎用クラスがモデル私ConfigurationItem.
public class ConfigurationItem<T>
{
private T item;
public ConfigurationItem(T item)
{
this.item = item;
}
public T GetValue()
{
return item;
}
}
そのクラスを作成する公開動的に読み取り専用の変数の設定項目です。こうして私を見てもConnectionStringSettingsからコンフィグファイルを、いろいろな形式をサポートしています。もちろん用品を読むことができ価値観からです。
public class ConfigurationItems
{
public static ConfigurationItem<ConnectionStringSettings> ConnectionSettings = new ConfigurationItem<ConnectionStringSettings>(RetrieveConnectionString());
private static ConnectionStringSettings RetrieveConnectionString()
{
// In .Net, we store our connection string in the application/web config file.
// We can access those values through the ConfigurationManager class.
return ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["ConnectionKey"]];
}
}
そうConfigurationItem利用にあたり、私もこのように:
ConfigurationItems.ConnectionSettings.GetValue();
で返しまうタイプの安全な値は、そのキャッシュはいいと思います。
こちらのサンプル試験
[TestFixture]
public class ConfigurationItemsTest
{
[Test]
public void ShouldBeAbleToAccessConnectionStringSettings()
{
ConnectionStringSettings item = ConfigurationItems.ConnectionSettings.GetValue();
Assert.IsNotNull(item);
}
}
武器agiは、dexで下がらないboxerぐ.
通常、この取り扱いによるiniファイルまたはXMLの設定ファイルを指定します。その後すぐにクラスを読み込み時の設定neeed.
.純こ築のConfigurationManagerの授業でも簡単に実施で読取るだけでテキストファイル、または負荷XMLをDOMや解析手にコードです。
有configファイルをデータベースがokな提携では、データベースに、ゴーストdependancy用アプリini/xmlファイルの課題である。
かったのです:
public class MySettings
{
public static double Setting1
{ get { return SettingsCache.Instance.GetDouble("Setting1"); } }
public static string Setting2
{ get { return SettingsCache.Instance.GetString("Setting2"); } }
}
この別のインフラのモジュールを除去する課題を円形ケージを
こんに縛られない特定の設定方法をもたない文字列を爆走自分用のコードです。