단위 테스트 프로젝트가 대상 응용 프로그램의 app.config 파일을로드 할 수 있습니까?


151

app.config 파일을 사용하여 구성 속성을로드하는 .NET 응용 프로그램 (.exe)을 단위로 테스트하고 있습니다. 단위 테스트 응용 프로그램 자체에는 app.config 파일이 없습니다.

구성 속성 중 하나를 사용하는 메서드를 단위 테스트하려고하면 null이 반환 됩니다. 단위 테스트 응용 프로그램이 대상 응용 프로그램의 app.config에로드되지 않기 때문이라고 가정합니다.

이것을 재정의하는 방법이 있습니까? 아니면 대상 app.config의 내용을 로컬 app.config에 복사하는 스크립트를 작성해야합니까?

게시물 종류는이 질문을하지만 저자는 실제로 내가 아닌 다른 각도에서 그것을보고 있습니다.

편집 : 단위 테스트에 VS08 Team System을 사용하고 있다고 언급해야합니다.

답변:


59

가장 간단한 방법은 .config단위 테스트의 배포 섹션에 파일 을 추가하는 것 입니다.

이렇게하려면 .testrunconfig솔루션 항목에서 파일을 엽니 다 . 배치 섹션 .config에서 프로젝트의 빌드 디렉토리 (아마도 bin\Debug) 의 출력 파일을 추가하십시오 .

배포 섹션에 나열된 모든 항목은 테스트를 실행하기 전에 테스트 프로젝트의 작업 폴더에 복사되므로 구성 종속 코드가 정상적으로 실행됩니다.

편집 : 추가하는 것을 잊었습니다. 모든 상황에서 작동하지는 않으므로 .config단위 테스트의 이름과 일치하도록 출력의 이름을 바꾸는 시작 스크립트를 포함해야 할 수도 있습니다 .


9
테스트 프로젝트에 app.config 파일을 추가하는 것이 훨씬 쉽습니다. 그런 다음 .testrunconfig를 전혀 사용하지 않아도됩니다.
Rowland Shaw

13
@Rowland 그렇게하면 app.config의 두 복사본을 유지해야합니다. 두 위치에서 app.config를 업데이트하는 것을 기억 해야하는 것보다 .testrunconfig 도구를 사용하여 한 번 10 초를 보내고 싶습니다.
Jeromy Irvine 2012

66
비 복사 참조 만 추가 할 수 없습니까? (기존 아이템 추가 ...)
EFraim

6
EFraim의 의견은 인정되는 답변이어야합니다. 이것은 다른 것보다 훨씬 간단합니다.
reggaeguitar

28
EFraim의 솔루션 : 명령 단추에서 "링크로 추가"를 사용해야합니다. 그렇지 않으면 여전히 사본을받습니다. 문제는 닷넷 응용 프로그램을 위해 특별히 있지만 또한, 웹 응용 프로그램의 설정과 같은 웹 응용 프로그램에 대해이하지 않습니다 작품은 잘못된 이름 (의 Web.config,하지의 app.config)가
롭 폰 Nesselrode

103

Visual Studio 2008에서는 app.config파일을 테스트 프로젝트에 기존 항목으로 추가하고 파일이 복제되지 않도록 링크로 사본을 선택했습니다. 그렇게하면 솔루션에 사본이 하나만 있습니다. 여러 테스트 프로젝트를 통해 정말 편리합니다!

기존 항목 추가

링크로 추가


7
완벽한 대답, 간단하고 객관적인! +1
Custodio

2
이것이 최선의 해결책이며 답변으로 표시해야합니다.
niaher

4
기존 항목을 "링크로"추가하려면 다음을 수행해야합니다. "기존 항목 추가 대화 상자에서 링크 할 프로젝트 항목을 찾아서 선택하십시오", "열기 단추 드롭 다운 목록에서 링크로 추가를 선택하십시오. "
uriel

이것은 나를 위해 잘 작동했습니다. 나는 그것이 작동하지 않을 상황을 생각하려고 노력하고 있습니다 ... 그리고 나는 지금 충분히 생각했습니다. 감사!
Dudeman3000

53

사용하든 팀 시스템 테스트 또는 NUnit과를 , 가장 좋은 방법은 테스트를 위해 별도의 클래스 라이브러리를 만드는 것입니다. 테스트 프로젝트에 App.config를 추가하면 컴파일 할 때 자동으로 bin 폴더에 복사됩니다 .

코드가 특정 구성 테스트에 의존하는 경우, 내가 작성하는 첫 번째 테스트는 구성 파일이 사용 가능한지 검증합니다 ( 내가 미친 것이 아니라는 것을 알 수 있습니다 ).

<configuration>
   <appSettings>
       <add key="TestValue" value="true" />
   </appSettings>
</configuration>

그리고 테스트 :

[TestFixture]
public class GeneralFixture
{
     [Test]
     public void VerifyAppDomainHasConfigurationSettings()
     {
          string value = ConfigurationManager.AppSettings["TestValue"];
          Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found.");
     }
}

이상적으로는 구성 개체가 클래스로 전달되도록 코드를 작성해야합니다. 이를 통해 구성 파일 문제와 분리 될뿐만 아니라 다양한 구성 시나리오에 대한 테스트를 작성할 수도 있습니다.

public class MyObject
{
     public void Configure(MyConfigurationObject config)
     {
          _enabled = config.Enabled;
     }

     public string Foo()
     {
         if (_enabled)
         {
             return "foo!";
         }
         return String.Empty;
     }

     private bool _enabled;
}

[TestFixture]
public class MyObjectTestFixture
{
     [Test]
     public void CanInitializeWithProperConfig()
     {
         MyConfigurationObject config = new MyConfigurationObject();
         config.Enabled = true;

         MyObject myObj = new MyObject();
         myObj.Configure(config);

         Assert.AreEqual("foo!", myObj.Foo());
     }
}

2
나는 여기에 구성 종속성을 전달한다는 정신에 동의합니다. 이것은 Mark Seemann에 의해 대답 된 것 같습니다! 여기 : .config 파일이 없어서 유닛 테스트 실패
Shaun

"줄에서 누락되었습니다 : 문자열 값 = ConfigurationManager.AppSettings ["TestValue]; 나는 그것을 고치려고 노력했지만, 편집 할 수 있도록 스택 오버 플로우를 얻으려면 고칠 5자를 더 찾아야했다.
Jane

22

예를 들어 웹 응용 프로그램 및 테스트 프로젝트가 포함 된 솔루션이있는 경우 테스트 프로젝트가 웹 응용 프로그램의 web.config를 사용하는 것이 좋습니다.

이를 해결하는 한 가지 방법은 web.config를 복사하여 프로젝트를 테스트하고 app.config로 이름을 바꾸는 것입니다.

또 다른 더 나은 솔루션은 빌드 체인을 수정하고 프로젝트 출력 디렉토리를 테스트하기 위해 web.config의 자동 사본을 만드는 것입니다. 이를 수행하려면 애플리케이션 테스트를 마우스 오른쪽 단추로 클릭하고 특성을 선택하십시오. 이제 프로젝트 속성을 볼 수 있습니다. "이벤트 빌드"를 클릭 한 다음 "포스트 빌드 편집 ..."버튼을 클릭하십시오. 다음 줄을 작성하십시오.

copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"

그리고 확인을 클릭하십시오. (테스트하려는 프로젝트 이름으로 WebApplication1을 변경해야 할 수도 있습니다). web.config의 경로가 잘못되면 복사가 실패하고 빌드에 실패한 것을 알 수 있습니다.

편집하다:

현재 프로젝트에서 테스트 프로젝트로 복사하려면 :

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"

정말 좋은 해결책입니다. .config파일 복사 및 복제를 피할 수있었습니다. 공유해 주셔서 감사합니다! :)
Leniel Maccaferri

아주 좋은 해결책! 고마워
Vin Shahrdar

좋은 해결책이지만 주 프로젝트가 동일한 프로젝트 내의 web.config외부 .config파일에 대한 참조 만 가질 때 어떻게됩니까 ? 경로는 동일한 디렉토리 (일반적으로 사실임) 내의 폴더 만 가리킬 수 있으므로 테스트를 실행할 때 외부 파일을 처리 할 수 ​​없습니다. 어떻게 해결할 수 있습니까?
Sugafree

이것은 나를 위해 일했다 : 복사 "$ (SolutionDir) \ MainProject \ Web.config" "$ (ProjectDir) app.config"
Andrew

8

이것은 조금 낡았지만 더 좋은 해결책을 찾았습니다. 여기서 선택한 답변을 시도했지만 .testrunconfig가 이미 사용되지 않는 것처럼 보입니다.

1. 단위 테스트의 경우 구성은 인터페이스 (IConfig)입니다.

단위 테스트의 경우 구성은 실제로 테스트의 일부가 아니므로 주입 할 수있는 모의 객체를 만듭니다. 이 예에서는 Moq를 사용하고있었습니다.

Mock<IConfig> _configMock;
_configMock.Setup(config => config.ConfigKey).Returns("ConfigValue");
var SUT = new SUT(_configMock.Object);

2. 통합 테스트의 경우 필요한 구성을 동적으로 추가하십시오.

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if(config.AppSettings.Settings[configName] != null)
{
    config.AppSettings.Settings.Remove(configName);
}
config.AppSettings.Settings.Add(configName, configValue);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("appSettings");

5

이것은 매우 쉽습니다.

  • 테스트 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
  • 추가-> 기존 항목
  • 추가 버튼 옆에 작은 화살표가 있습니다.
  • 구성 파일을 선택하고 "링크로 추가"를 클릭하십시오

4

NUnit을 사용하는 경우이 게시물을 살펴보십시오 . 기본적으로 .nunit 파일과 동일한 디렉토리에 app.config가 있어야합니다.


단위 테스트에 VS08 Team System을 사용하고 있지만 NUnit 팁에 감사드립니다!
Jordan Parmer

2

응용 프로그램에서 Asp.net ConnectionString과 같은 설정을 사용하는 경우 HostType 특성을 메서드에 추가해야합니다. 그렇지 않으면 App.Config 파일이 있어도로드되지 않습니다.

[TestMethod]
[HostType("ASP.NET")] // will load the ConnectionString from the App.Config file
public void Test() {

}

0

NUnit을 사용 하고 프로젝트 디렉토리에 일부 구성을 변경하는 App.Config 사본이 있습니다 (예 : 테스트 데이터베이스로 리디렉션합니다 ...). 테스트 된 프로젝트 의 동일한 디렉토리 에 있어야하며 괜찮을 것입니다.


0

nUnit 2.5.10에서 작동하는 이러한 제안을 얻을 수 없으므로 nUnit의 Project-> Edit 기능을 사용하여 대상 구성 파일을 지정하는 것으로 끝났습니다 (다른 사람들이와 동일한 폴더에 있어야한다고 말했듯이). nunit 파일 자체). 이것의 긍정적 인 측면은 구성 파일에 Test.config 이름을 부여하여 그것이 무엇인지와 그 이유를 훨씬 명확하게 할 수 있다는 것입니다)


0

단위 테스트는 코드를 실행하여 테스트하는 환경으로 간주됩니다. 일반적인 환경과 마찬가지로 준비 / 생산이 있습니다. .config테스트 프로젝트를위한 파일 을 추가해야 할 수도 있습니다. 해결 방법은 클래스 라이브러리를 만들고 NUnit 및 NUnit Adapter와 같은 필요한 NuGet 패키지를 추가하여 테스트 프로젝트로 변환하는 것입니다. Visual Studio Test Runner와 Resharper 모두에서 완벽하게 작동 app.config하며 테스트 프로젝트에 파일이 있습니다. 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

그리고 마침내 내 테스트와 값을 디버깅했습니다 App.config:

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.