.NET 콘솔 앱(및 테스트)에 종속성 주입 추가

4193 단어 dotnettesting
안녕하십니까!

DI(Dependency Injection)가 오늘날 사실상의 표준이 되었다는 사실을 알아차렸을 것입니다. DI가 (적절하게 사용된다면) 테스트 가능하고 변경 가능하며 분리된 코드베이스로 이어지기 때문에 틀림없이 그렇습니다. 그러나 (적어도 ASP.NET 에코시스템에서) 한 가지 문제는 새 ASP.NET 프로젝트를 만들 때 너무 많은 부트스트래핑이 처리되기 때문에 DI를 설정하는 방법이 혼란스럽고 명확하지 않을 수 있다는 것입니다. ASP.NET 웹 프로젝트가 수행하는 기본 스캐폴딩을 얻지 못하는 자동화된 테스트 또는 기타 최상위 프로젝트. 이 작업을 수행하는 방법에 대한 몇 가지 가이드가 있지만 보풀이 없는 최소한의 가이드가 있습니다.

아, 더 진행하기 전에 여기에 표시된 예제는 ASP.NET Core 프로젝트와 함께 기본 제공되는 Microsoft의 단순한 DI 컨테이너를 사용할 것임을 언급하겠습니다. 여기서 다루는 개념은 다른 컨테이너와 비슷하지만 코드 자체는 약간 다릅니다.

먼저 일부 패키지를 주문할 수 있습니다.





버전 관리와 관련하여 솔루션의 다른 프로젝트에 이미 설치되어 있을 가능성이 있습니다. 따라서 프로젝트 간에 .NET 버전을 혼합하고 일치시키지 않는 한 버전을 동일하게 유지하는 것이 좋습니다. 이러한 이유로 필요한 패키지를 나열하고 적절한 버전을 알아낼 수 있도록 하겠습니다.
  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.DependencyInjection
  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Extensions.Options

  • 앱 설정 추가



    구성과 관련하여 기존 ASP.NET 웹 프로젝트 내의 appsettings.*.json 파일에 일부 사용자 지정 앱 설정이 정의되어 있을 수 있습니다. 동일한 설정을 적용하려면 이를 새(베어 본) 프로젝트에 가져와야 합니다. 이를 위한 몇 가지 옵션이 있습니다.

    1) 새 프로젝트에 대한 사용자 지정 설정 파일을 만듭니다. 2) 웹 프로젝트의 기존 appsettings.json 파일을 새 프로젝트로 복사합니다. 또는 3) 기존 appsettings.json 파일의 링크를 새 프로젝트에 추가합니다.

    나는 보통 옵션 3을 선호하므로 기본 웹 프로젝트의 appsetting.json 파일에서 변경한 사항은 새 프로젝트에도 적용되며 두 개 이상의 구성 파일을 유지 관리할 필요가 없습니다.



    * 이 모양은 Rider 또는 VS for Mac에서 약간 다르게 보일 수 있지만 여전히 있어야 합니다.

    모두 설정



    여기서는 DI 컨테이너의 부트스트래핑 및 기타 설정을 처리하기 위해 xxxBootstrapper 클래스를 생성할 것을 제안합니다. 여기서 xxx는 프로젝트의 접두사입니다. 예: 이것이 테스트 프로젝트인 경우 이것을 TestBootstrapper라고 부를 수 있습니다.

    예를 들어:

        public static class TestBootstrapper
        {
            public static void Bootstrap(IServiceCollection services)
            {
                // todo: Add any test services
            }
        }
    
    


    훌륭합니다. 하지만 IServiceCollection 인스턴스를 실제로 어떻게 만듭니까?



    정중하게 물어보세요 :) 진지하게, ServiceCollection 의 구체적인 구현인 새로운 IServiceCollection 를 생성하세요.

        public static class ServiceProviderFactory
        {
            public static IServiceProvider CreateServiceProvider()
            {
                var services = new ServiceCollection();
    
                LibraryBootstrapper.Bootstrap(services);
                TestBootstrapper.Bootstrap(services);
    
                return services.BuildServiceProvider();
            }
        }
    
    


    모든 단일 테스트에서 이 작업을 수행하고 부트스트래핑 논리가 솔루션과 같이 커질 것이므로 편의를 위해 이것을 공장 내부에 배치했습니다.

    함께 모아서



    여기 있습니다 :) SetupTest는 NUnit 관련 속성이며 사용 중인 테스트 프레임워크에 따라 사용해야 하는 것과 다를 수 있습니다. 다른 사람들은 바보입니다.

    *** 위의 진술은 농담입니다. 원하는 테스트 프레임워크를 사용하십시오.

    using ConsoleDependencyInjection.Library;
    using Microsoft.Extensions.DependencyInjection;
    
    namespace ConsoleDependencyInjection.Tests;
    
    public class MyServiceTests
    {
        private IMyService _sut;
    
        [SetUp]
        public void Setup()
        {
            _sut = ServiceProviderFactory
                .CreateServiceProvider()
                .GetService<IMyService>();
        }
    
        [Test]
        public void Test1()
        {
            Assert.DoesNotThrow(() =>
            {
                _sut.DoTheThing();
            });
        }
    }
    
    

    Setup 메서드(각 테스트 전에 실행됨)에서 이전에 생성한 팩터리에서 서비스 공급자의 인스턴스를 만들고 DI에 대한 Service Locator 접근 방식을 사용하여 공급자에게 테스트하려는 서비스를 요청합니다. 작동 중인 모든 것을 보려면 Github에서 저장소를 확인하십시오.

    읽어 주셔서 감사합니다! 잡아!

    좋은 웹페이지 즐겨찾기