Nunit에게 특정 디렉토리에서 어셈블리의 DLL.config 파일을로드하도록 어떻게 지시합니까?

StackOverflow https://stackoverflow.com/questions/1412235

문제

어셈블리에 app.config 파일이 포함 된 경우 ConfigurationManager Nunit-Gui를 통해 실행되는 Nunit 프로젝트와 동일한 디렉토리에있는 한로드합니다. 설명하기 위해 다음 폴더 구조를 고려하십시오.

+ TestFolder
    testProject.nunit
  + AssemblyAFolder
      assemblyA.dll
      assemblyA.dll.config
  + AssemblyBFolder
      assemblyB.dll
      assemblyB.dll.config

둘 다 AssemblyA 그리고 AssemblyB 호출하는 운동 코드 ConfigurationManager. Nunit-Gui 에서이 테스트 어셈블리를 독립적으로 실행하면 ConfigurationManager 로컬 구성 파일을 올바르게 해결합니다.

그러나 내가로드하면 testProject.nunit Nunit-Gui (둘 다에 대한 참조가 포함되어 있습니다 AssemblyA 그리고 AssemblyB), ConfigurationManager 구성 파일을 찾습니다 TestFolder 현재 어떤 어셈블리가 실행 중인지에 관계없이

응용 프로그램 구성을 현재 어셈블리 디렉토리에있는 존재로 다시로드하도록 지시하는 방법이 있습니까?

다음은의 내용입니다 testProject.nunit:

<NUnitProject>
  <Settings activeconfig="Debug" />
  <Config name="Debug" binpathtype="Auto">
    <assembly path="AssemblyAFolder\assemblyA.dll" />
    <assembly path="AssemblyBFolder\assemblyB.dll" />
  </Config>
</NUnitProject>
도움이 되었습니까?

해결책

Nunit 블로그는 구성 파일이 왜 그렇게로드하는지에 대해 설명했습니다. 기본적으로 그들이 말한 것은 Nunit이 프레임 워크가 구성 파일을 처리 할 수있게하고 관리를 수행하지 않는다는 것입니다.

당신은 또한 사용할 수 있습니다 testProject.config 각 어셈블리의 구성 파일을 참조하기 위해 귀하의 경우에로드 될 파일. AppSettings 파일 속성을 사용하여 키를 추가합니다.

마지막 대안 중 하나는 사용하는 것입니다 configSource 요소 속성 어셈블리 구성 파일 중 하나에서 섹션을 사용합니다.

도움이 되었기를 바랍니다.

다른 팁

Nunit은 프로젝트에서 app.config 파일의 경로를 찾을 수 없습니다. 따라서 App.Config 파일이 프로젝트에 배치되는 위치 (루트 폴더)를 수동으로 Nunit에게 알려야합니다.

제 경우에는 프로젝트 구조가 다음과 같습니다.

     +ProjectWEBApp//web pages
       +Modules
         +aspx pages
       +web.Config

    +projectBusinesslogic //business logic .cs files
       +Modules
         +.cs

      +ProjectTestName// a seperate Nunit test cases project
        +Modules
      +App.Config

ProjectWebApp은 비즈니스 로직을 포함하는 ProjectBusinessLogic의 참조를 사용합니다. +ProjectTestName은 ProjectBusinessLogic의 참조를 사용하여 비즈니스 로직에서 테스트를 수행합니다. 문제는 여기에서 시작됩니다. Nunit Test Project에는 자체 app.config 파일이 필요합니다. ProjectBusinessLogic의 경우와 같이 web.config 파일을 사용하지 않으므로 Nunit을 실행하면 오류가 발생합니다.

-Null Reference Exception ....... 객체 인스턴트로 설정되지 않았습니다 ...........

해결책- Nunit Gui를 실행할 때

  1. 프로젝트-> 새로운 팝업 편집이 열립니다
  2. 속성-> 일반-> 구성 파일 이름-> 추가 app.config 파일 이름
  3. 파일-> 팝업 창을 저장하고 닫습니다
  4. Nunit Gui-File-> Reload Project

그리고 그것은 당신의 문제에 대한 간단한 해결책입니다

그만큼 configSource 요소 Marklawrence가 제공하는 해결책 내가 찾고 있던 것이고 잘 작동합니다. 그러나이 솔루션을 구현할 때의 과제는 명시적인 수녀 프로젝트에서 테스트를 실행할 때 어셈블리 구성로드를 만드는 것입니다 ( 내 경우), 그리고 단위를 실행할 때 어셈블리를 분리하는 경우 (명시 적 프로젝트 없음). 이를 달성하기 위해서는 파일 레이아웃에 대한 다음 수정이 필요했습니다.

+ TestFolder
    testProject.nunit
    testProject.config
  + AssemblyAFolder
      assemblyA.dll
      assemblyA.dll.config
      assemblyA.dll.configfragment
  + AssemblyBFolder
      assemblyB.dll
      assemblyB.dll.config
      assemblyB.dll.configfragment

그만큼 configfragment 파일은 해당 한 번에 있었던 어셈블리 구성을 포함하도록 만들어졌습니다. config 파일. 그 후, config 파일 만 포함하도록 파일이 수정됩니다 configSource 해당에 대한 상대 경로가있는 요소 configfragment 파일. 이 접근법이 작동하지 않는 유일한 시간은 assemblyA.dll 그리고 assemblyB.dll 둘 다 동일한 구성 섹션이 필요합니다. testproject.config.

이 접근법을 실험 한 후 런타임에서 어셈블리 구성을 생성하는 데 의존하고 정적 구성 파일을 모두 함께 제거하기로 결정했습니다. 다음은 구성을 생성하는 방법을 보여주고 어셈블리 언더 테스트가로드되는 방법에 관계없이 액세스 할 수 있도록하는 코드입니다.

void WithConfigurationFile(Action method)
{
    // Create the assembly configuration.
    string settingsSection = "myConfigSectionName";
    Configuration config =
        ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.Sections.Add(
        settingsSection,
        new ConfigSectionType(/*config element values*/);
    config.Save();

    try
    {
        // Invoke the method with the new configuration.
        ConfigurationManager.RefreshSection(settingsSection);
        method();
    }
    finally
    {
        // Revert the assembly configuration.
        File.Delete(config.FilePath);
        ConfigurationManager.RefreshSection(settingsSection);
    }
}

사용함으로써 configurationManager.openexeConfiguration () 경로를 허용하지 않는 오버로드는 호스트 응용 프로그램의 작업 디렉토리에서 구성을로드합니다. 또한 시도/마지막으로 블록은 어셈블리 구성이 다른 테스트를 방해하지 않도록 보장하며, 이는 그러한 구성이 필요하지 않을 수도 있습니다.

마지막으로 단위 테스트 내에서 사용하려면 :

[Test]
void VerifyFunctionality
{
    WithConfigurationFile(delegate
    {
        // implement unit test and assertions here
    });
}

나는 이것이 비슷한 문제에 직면 한 다른 사람들을 도울 수 있기를 바랍니다!

.NUNIT 파일의 구성 레벨에서 configfile 속성을 사용하십시오.


<Config name="Debug" configfile="myconfigfilenamegoeshere.config />

실제로 Visual Studio 내에서 Nunit과 러너를 사용하는 경우 테스트 프로젝트에서 App.Config에 가치를 고착 할 수 있습니다. 그런 다음이 줄을 건축 후 이벤트에 추가하십시오.

COPY /y "$ (ProjectDir) app.config" "$ (TargetDir) $ (TargetFilename) .config"

테스트에서 configurationManager에 액세스하면 Nunit은 초기화 메소드에서 app.config의 값을 .NET으로 전달합니다.

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