문제

App.Config 파일의 값에 의존하는 응용 프로그램을 단위 테스트 할 때? 해당 값이 올바르게 읽히고 구성 파일에 입력 된 잘못된 값에 반응하는 방법을 어떻게 테스트합니까?

Nunit 앱의 구성 파일을 수정 해야하는 것은 우스운 일이지만 테스트하려는 app.config의 값을 읽을 수는 없습니다.

편집 : 아마도 명확히해야한다고 생각합니다. ConfigurationManager가 값을 읽지 못하는 것에 대해 걱정하지 않지만 프로그램이 읽은 값에 어떻게 반응하는지 테스트하는 데 관심이 있습니다.

도움이 되었습니까?

해결책

나는 일반적으로 기능이 거의없는 자체 외관 클래스에서 구성 파일을 읽는 것과 같이 외부 종속성을 분리합니다. 테스트에서는이 클래스의 모의 버전을 만들 수 있으며 실제 구성 파일 대신이를 구현하고 사용할 수 있습니다. 자신만의 mockup을 만들거나 moq 또는 rhino mocks와 같은 프레임 워크를 사용할 수 있습니다.

이렇게하면 먼저 XML-Configuration 파일을 작성하는 복잡한 테스트를 작성하지 않고 다른 구성 값으로 코드를 쉽게 시도 할 수 있습니다. 구성을 읽는 코드는 일반적으로 너무 간단하여 테스트가 거의 필요하지 않습니다.

다른 팁

테스트 설정에서 런타임에 구성 섹션을 수정할 수 있습니다. 예 :

// setup
System.Configuration.Configuration config = 
     ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add("sectionname", new ConfigSectionType());
ConfigSectionType section = (ConfigSectionType)config.GetSection("sectionname");
section.SomeProperty = "value_you_want_to_test_with";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("sectionname");

// carry out test ...

물론 자신만의 도우미 방법을 설정하여 더 우아하게 수행 할 수 있습니다.

ConfigurationManager.AppSettings 세트 메소드를 호출하여 특정 단위 테스트에 필요한 값을 설정할 수 있습니다.

[SetUp]
public void SetUp()
{
  ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue");
  // rest of unit test code follows
}

단위 테스트가 실행되면이 값을 사용하여 코드를 실행합니다.

당신은 모두 읽고 쓸 수 있습니다 app.config 파일 ConfigurationManager 수업

나는 web.config와 비슷한 문제에 직면하고있었습니다 .... 흥미로운 해결책을 찾았습니다. 구성 읽기 기능 (예 : 다음과 같은 것)을 캡슐화 할 수 있습니다.

public class MyClass {

public static Func<string, string> 
     GetConfigValue = s => ConfigurationManager.AppSettings[s];

//...

}

그런 다음 일반적으로 사용합니다

string connectionString = MyClass.GetConfigValue("myConfigValue");

그러나 단위 테스트에서는 다음과 같은 기능을 "재정의"초기화합니다.

MyClass.GetConfigValue = s =>  s == "myConfigValue" ? "Hi", "string.Empty";

그것에 대해 더 많이 :

http://rogeralsing.com/2009/05/07/the-simplest-form-of-configurable-dependency-injection/

보다 우아한 솔루션은 구성 설정 자체에 일반 기존 의존성 주입을 사용하는 것입니다. IMHO 이것은 구성을 읽는 클래스/래퍼 등을 조롱하는 것보다 깨끗합니다.

예를 들어, 클래스 "날씨"는 기능을 위해 "서비스가"필요합니다 (예 : 날씨를 얻기 위해 웹 서비스를 호출한다고 말함). 해당 설정을 가져 오기 위해 구성 파일로 적극적으로 이동하는 코드 줄을 갖지 않고 (해당 코드가 날씨 클래스에 있는지 또는 다른 응답에 따라 조롱 할 수있는 별도의 구성 리더 여부) 날씨 클래스는 허용 할 수 있습니다. 매개 변수를 통해 생성자로 또는 속성 세터를 통해 주입 될 설정입니다. 이렇게하면 단위 테스트는 매우 간단하고 직접적이며 조롱이 필요하지 않습니다.

그런 다음 설정 값은 제어 (또는 종속성 주입) 컨테이너의 역전을 사용하여 주입 할 수 있으므로 날씨 등급의 소비자는 컨테이너가 처리 할 때 어딘가에서 값을 명시 적으로 제공 할 필요가 없습니다.

그것은 나를 위해 일했다 :

 public static void BasicSetup()
  {
     ConnectionStringSettings connectionStringSettings = 
          new ConnectionStringSettings();
     connectionStringSettings.Name = "testmasterconnection";
     connectionStringSettings.ConnectionString = 
          "server=localhost;user=some;database=some;port=3306;";
     ConfigurationManager.ConnectionStrings.Clear();
     ConfigurationManager.ConnectionStrings.Add(connectionStringSettings);
  }

항상 인터페이스에 읽기 비트를 랩핑하고 구성 파일에서 특정 구현을 읽을 수 있습니다. 그런 다음 모의 개체를 사용하여 테스트를 작성하여 프로그램이 잘못된 값을 처리하는 방법을 확인합니다. 개인적으로, 나는이 특정 구현을 테스트하지 않을 것입니다. 이것은 .NET Framework 코드이기 때문에 (그리고 희망적으로 - MS가 이미 테스트했다고 가정합니다).

System.Configuration.Abstractions는 이런 종류의 것들을 테스트 할 때 아름다움입니다.

다음은 좋은 예가있는 Github 프로젝트 사이트입니다. 여기에 링크 설명을 입력하십시오

다음은 Nuget 사이트입니다. https://www.nuget.org/packages/system.configuration.abstractions/

나는 이것을 거의 모든 .NET 프로젝트에서 사용합니다.

실제로, 더 생각하면, 내가해야 할 일은 프로젝트에서 사용하기 위해 configfilereader 클래스를 만들고 단위 테스트 하네스에서 가짜를 만들어내는 것입니다.

그게 평범한 일입니까?

가장 간단한 옵션은 테스트 중 값을 대체 할 수 있도록 구성을 읽는 메소드를 래핑하는 것입니다. 읽기 구성에 사용하는 인터페이스를 작성하고 해당 인터페이스 구현이 생성자 매개 변수로 전달되거나 객체를 속성으로 설정합니다 (의존성 주입/제어의 반전을 사용하여). 생산 환경에서는 구성에서 실제로 읽는 구현을 통과합니다. 테스트 환경에서 알려진 값을 반환하는 테스트 구현을 통과하십시오.

테스트 가능성을위한 코드를 리팩토링 할 수있는 옵션이 없지만 여전히 테스트 해야하는 경우 TypeMock Isolator는 실제로 .NET 프레임 워크 구성 클래스를 조롱 할 수있는 기능을 제공하므로 다음에 "다음과 같은 요청을 요청할 수 있습니다. 그러한 appsetting 값은이 알려진 값을 반환합니다. "

나는 같은 문제가 있었는데

NUNIT-CONSOLE.EXE C : PATH1 TETDLL1.DLL C : PATH2 TESTDLL2.DLL을 사용할 수 있습니다.

두 dlls가 다른 app.configs ex testdll1.dll.config 및 testdll2.dll.config를 가리키는 경우에도 잘 작동합니다.

Nunit Project 구성을 사용 하고이 두 DLL을 랩핑하려면 두 개의 구성을 가질 수있는 방법이 없습니다.

Nunit Project가 Project1.nunit 인 경우 project1.nunit이 있으면 project1.config가 있어야합니다.

도움이 되었기를 바랍니다

글쎄, 나는 단지 같은 문제를 겪었습니다 ... 웹 사이트에서 참조 된 BL 프로젝트를 테스트하고 싶었습니다. 그러나 나는 BL 만 테스트하고 싶었다. 따라서 테스트 프로젝트의 사전 건축 이벤트에서는 app.config 파일을 bin debug 폴더에 복사하여 app.config에서 참조합니다 ...

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