xUnit 프로젝트 내에서 dotnet IConfiguration 사용

7025 단어
.NET 코어 XUnit 프로젝트에서는 구성 기능을 쉽게 사용할 수 없습니다.

내 필요는 리포지토리에 커밋하지 않고 UI 테스트 내에서 비밀을 사용하는 것입니다(즉, 웹 앱을 테스트하기 전에 로그인하기 위해).

나는 다른 솔루션을 읽고 많은 타사 라이브러리를 찾았지만 결국 간단한 접근 방식을 선택했습니다. 몇 줄의 코드를 다양한 요구 사항에 쉽게 적용할 수 있고 여전히 로컬 개발 및 CI/CD 환경 모두에서 작동합니다.

데모 목적으로 간단한 github repo을 만들었습니다.

기본적으로 2개의 파일이 있습니다.
  • appsettings.json - 커밋할 수 있지만 중요한 데이터는 포함하지 않습니다. 여기에 민감한 데이터에 대한 자리 표시자를 사용하여 구성을 넣습니다.
  • appsettings.local.json - 커밋하지 말고 .gitignore 파일에 나열해야 합니다. 여기에 중요한 데이터를 입력하고 appsettings.json에서 자리 표시자를 재정의합니다.

  • 그런 다음 해당 파일을 출력 디렉터리에 복사하여 .csproj에 추가해야 합니다.

        <ItemGroup Condition="'$(Configuration)' == 'Debug'">
            <None Update="appsettings.json" CopyToOutputDirectory="PreserveNewest" />
        </ItemGroup>
        <ItemGroup Condition="'$(Configuration)' == 'Debug'">
            <None Update="appsettings.local.json" CopyToOutputDirectory="PreserveNewest" />
        </ItemGroup>
    


    이제 코드입니다.

    모든 테스트에서 IConfiguration을 설정하기 위한 유틸리티 클래스( TestConfigHelper )를 만듭니다(필요에 따라 이 클래스를 조정할 수 있습니다. 예는 다음에서 보고됩니다).

    여기에서 구성 서비스를 구성합니다.

    public static IConfigurationRoot GetIConfigurationRoot()
    {
        return new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile("appsettings.local.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
    }
    


    이 코드에서는 다음 세 위치에서 구성을 가져옵니다.
  • 첫 번째 appsetting.json
  • appsetting.local.json
  • 결국 환경
  • 에서

    순서가 중요합니다. appsetting.local.json은 appsetting.json을 재정의하고 환경 변수는 모든 것을 재정의합니다.

    이러한 방식으로 로컬 개발에 appsetting.local.json을 사용할 수 있지만 CI/CD 파이프라인의 환경 변수를 통해 민감한 데이터를 주입할 수도 있습니다.

    테스트는 구성 호출TestConfigHelper::GetIConfigurationRoot 메서드를 로드하는 BaseTestClass에서 상속해야 합니다.

    그리고 그게 다야. 이제 모든 테스트에서 GetIConfigurationRoot에서 반환된 개체를 사용하여 구성에 액세스할 수 있습니다.

    보너스 #1 - 구성 클래스



    내 애플리케이션 구성을 나타내는 클래스를 만들고 구성에 바인딩하는 것을 좋아합니다.TestConfigHelper에 이에 대한 예가 있습니다. 코드는 다음과 같습니다(여기서 MyAppConfig는 구성을 나타내는 클래스이며 구성 파일의 "MyApp"루트 노드에 저장됨).

    public static MyAppConfig GetMyAppConfiguration()
    {
        var configuration = new MyAppConfig();
        GetIConfigurationRoot().Bind("MyApp", configuration);
        return configuration;
    }
    


    보너스 #2: 사용자 비밀



    또한 로컬 개발을 위해 사용자 비밀을 구성할 수 있습니다. 이를 위해서는 더 많은 구성이 필요합니다.
  • 비밀 생성 및 설정

  • dotnet user-secrets init
    dotnet user-secrets set key value
    


  • 사용자 암호 키를 .csproj 파일에 추가:

  • <UserSecretsId>your-secret-id-here</UserSecretsId>
    


  • 다음과 같이 TestConfigHelper.cs에서 비밀도 구성합니다.

  • public static IConfigurationRoot GetIConfigurationRoot()
    {
        return new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile("appsettings.local.json", optional: true, reloadOnChange: true)
            .AddUserSecrets("e3dfcccf-0cb3-423a-b302-e3e92e95c128")         // <-- this is the new line !!
            .AddEnvironmentVariables()
            .Build();
    }
    

    좋은 웹페이지 즐겨찾기