문제

데이터베이스 응용 프로그램 내가 현재 작업에서,상점의 모든 종류를 설정 데이터베이스에서.사람들의 대부분은 설정이 있을 사용해 비즈니스 규칙이 있지만,또한 몇 가지 다른 재료에 있다.

앱 개체를 포함하는 특별히 하는 특정 작업,예를 들어,특정 복잡한 계산이 됩니다.그 non-UI 개체는 장치-테스트,하지만 또한 액세스를 필요 많은 사람들의 글로벌 설정입니다.방법은 우리 구현이 지금은 제공하여 객체 속성 가득한 응용 프로그램에 의해 컨트롤러에서 런타임입니다.시험할 때,우리가 만들의 개체 테스트 및 채울에서 값을 테스트하지 않는(데이터베이스에서).

이 작품을 더 나은 어떤 경우에,많은 것보다 더 나은 그 모든 객체를 필요로벌 설정 개체---는 물론 효과적으로 단위의 테스트:불가능)단점이 될 수 있다는 당신이 때로는 설정할 필요가 다스의 속성,또는 당신 그 속성을'여과'로 sub-체입니다.

그래서 일반적인 질문:당신은 어떻게 액세스를 제공하는 글로벌 응용 프로그램에서 설정을 귀하의 프로젝트에 대한 필요없이 전역 변수는 동안,여전히 수 있는 코드 단위 테스트?이 문제는 해결되었습 100 의의 시간...

(주의:나는지 너무 많이 경험이 풍부한 프로그래머로서,당신은 발견;하지만 내가 사랑하는 배우!그리고 물론,난 이미 이에 대해 연구 주제,하지만 정말 보는 일부가 직접 경험할 수)

도움이 되었습니까?

해결책

당신이 사용할 수 있습 마틴 마틴 파울러 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;
  }
}

귀하의 생산 코드를 초기화 서비스 locator 다음과 같다:

ServiceLocator::load(new ServiceLocator());

테스트 코드를 삽입하고 모형의 설정을 다음과 같다:

ServiceLocator s = new ServiceLocator();
s->setGlobalSettings(new MockGlobalSettings());
ServiceLocator::load(s);

저장해 싱글로 교환할 수 있는 테스트를 위한 목적입니다.

다른 팁

내가 좋아하는 모델을 구성 액세스를 끄는 서비스의 위치는 패턴이 있습니다.이런 단점을 얻을 구성하는 값이 필요하고 그것을 둬 응용 프로그램 외부에 별도의 라이브러리,그것은 다시 사용할 수 있습 및 테스트 편의성도 높아집니다.여기에 몇 가지 예제 코드,내가 무엇인지 언어를 사용하고 있지만,나는 그것을 썼다 C#으로 작성됩니다.

첫 번째 내가 만드는 일반적인 클래스는 것이 모델 내 ConfigurationItem.

public class ConfigurationItem<T>
{
    private T item;

    public ConfigurationItem(T item)
    {
        this.item = item;
    }

    public T GetValue()
    {
        return item;
    }
}

그때 나는 클래스를 만들려는 노출 public static readonly 에 대한 변수를 구성 항목입니다.여기에 나는 그냥 읽 ConnectionStringSettings config 파일에서는 xml.물론에 대한 더 많은 항목을 읽을 수 있는 값입니다.

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);
    }
}

이게 도움이 되었으면 좋겠습니다.

일반적으로 이에 의해 처리됩 ini 파일 또는 XML configuration file.당신은 클래스를 읽는 설정할 때 neeed.

.그물이 내장되어 ConfigurationManager 클래스이지만,그것은 매우 쉽게 구현,단지 텍스트 파일을 읽거나,로드 XML 로 DOM 또는 구문 분석하여 그들을 손에서 코드입니다.

데 config 파일에서 데이터베이스를 확인,하지만 당신을 데이터베이스를 만듭니다 추가 종속성을 위해 여러분의 어플리케이션 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"); } }
}

이에 넣어 별도의 인프라 모듈을 제거하는 모든 문제의 원형 종속성입니다.
이렇게 나에 묶여 있지 않을 어떤 특정 구성 방법,그리고 어떤 문자열이 실행에 혼란을 내 응용 프로그램 코드입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top