2016-10-12 2 views
0

메소드를 테스트하고 있었지만 ConfigurationManager.AppSettings를 moq 할 수 없다는 사실을 제외하고는 모든 것이 작동했습니다.Facade 어프로치를 사용하지 않고 ConfigurationManager.Appsetting을 모의 처리했습니다.

내 방법이

public async Task<IDictionary<string, object>> Action(IDictionary<string, object> context) 
    { 
     if (ConfigurationManager.AppSettings[ApplicationUserFromDomainUserKey] == null) 
      throw new ConfigurationErrorsException(ApplicationUserFromDomainUserKey); 
     string storedProcedure = ConfigurationManager.AppSettings.Get(ApplicationUserFromDomainUserKey); 

     if (ConfigurationManager.ConnectionStrings[DbConnectionKey] == null) 
      throw new ConfigurationErrorsException(DbConnectionKey); 
     ... 

} 내가 this question에서 본 적이

으로 정의된다

외관 방식을 사용하여 접근은 좋은 것입니다하지만 사용하지 않는 먼지 내 클래스 구현을 것이라고 IOC의/DI

의 나뿐만 아니라이 intresting article하지만 만 대 엔터프라이즈 에디션에 적용하고 나는 그것이 CI에 실행 가능한 받기를 원하시면/VS 전문 에디션

읽었습니다

내가 테스트를 위해 NUnit을 사용하고 내 테스트

 [Test] 
    public void MissingAppSettingsKey() 
    { 
      var pipeline = new RetrieveApplicationUsernamePipelineStep(); 

      var context = new Dictionary<string, object>() 
      { 
       [Resources.DomainUser] = "andrea", 
       [Resources.Domain] = "ifinformatica.net", 
       [Resources.ApplicationId] = 0 
      }; 

      Assert.ThrowsAsync<ConfigurationErrorsException>(async() => await pipeline.Action(context)); 

     } 

    } 

P.S.입니다 또한 마이크로 유닛 테스트 프레임 워크를 실행하지 못하도록하는 resharper 도구를 사용합니다.

+0

그럼 뭐가 궁금한가요? – stuartd

+1

구성을 삽입하고 싶지 않으면 응용 프로그램이 "ConfigurationManager.AppSettings"를 사용하지 않고 선택한 싱글 톤을 사용하는 것이 가장 이상적입니다. 변경하기가 더 쉽습니다. 만약 당신이 * 그걸하고 싶지 않다면, [런타임에 읽히고있는'.config' 파일을 재조정 할 수 있습니다.] (http://stackoverflow.com/questions/6150644/), hacky가 (그리고 당신이 파일을 생성 할 필요가있을 때 테스트를위한 차선책). –

답변

1

더 간단한 접근법은 DI 구현을 제한적으로 사용하여 ConfigurationManager 종속성을 제거하는 것입니다.

AppSettings 항목을 매개 변수로 사용하도록 생성자를 오버로드하십시오.

당신이 만든 그렇다면 지금과 같은 개체 :

이 ..with 생성자의 선언
MyObject myObj = new MyObject(SomeParam); 

...

public MyObject(ParamObj someParam) 
    { 
    //...implementation.... 
    } 

... 그래서처럼 과부하 ...

public MyObject(ParamObj someParam) 
    : this(someParam, Convert.ToInt32(ConfigurationManager.AppSettings["mySetting"])) 
    { 
    //...implementation.... 
    } 


    public MyObject(ParamObj someParam, int mySettingValue) 
    { 
    //...implementation.... 
    } 

이것은 테스트 할 때 ConfigurationManager을 호출하거나 필요로하지 않는 생성자를 사용하여 객체를 생성한다는 것을 의미합니다.

관련 문제