유닛 테스트용 아날로그 IoC 컨테이너

나는 IServiceCollection/IServiceProvider을 찾고 있다. 하나의 클래스 (또는 두 개의 의존 클래스) 에서 나의 여러 사이트/웹 서비스의 시작 코드를 테스트하기 위해 실제 것이 아닌 모크를 사용하고 있다.나는 최근에 그것들을 IoC로 바꾸었다. 처음에는 머리가 아팠다. 왜냐하면 나중에 필요한 몇 가지 유형을 IoC 용기에 등록하는 것을 잊었기 때문이다.
찾지 못했기 때문에, 나는 스스로 하나를 짓기로 결정했다.
나는 그것을 MockProvider이라고 부른다. 너도 NuGet을 통해 그것을 사용할 수 있다.
ASP에서 DI를 사용할 수 있습니다.NET 커널의 다양한 방법.
  • 구조 함수는 프레임워크에서 만든 클래스에 주입됩니다.내 상황에서 컨트롤러.
  •     public class MyController : Controller
        {
            public MyController(IFoo myFoo){ ... }
        }
    
  • 메서드는 ASP에서 호출된 메서드에 주입됩니다.순핵심.[FromServices] 속성을 사용하는 컨트롤러 방법과 유사합니다.
  • public class MyController : Controller
        {
            public async Task<IActionResult> Index([FromServices]IFoo myFoo){ ... }
        }
    
  • 은 수시로 수동으로 사용할 수 있으며, 많은 구조 함수에 IServiceProvider의 실례를 제공하고, 그 구조 함수에서 의존 관계를 해결할 수 있습니다.나는 네가 마땅하다고 말한 것이 아니지만, 너는 할 수 있다.
  • 네, 전 두 개에 관심이 많아서 저도 작은 Startup Tester을 만들어서 보일러판 코드를 최소화했습니다.도전하는 걸 좋아하니까.

    이게 어떻게 된 일입니까?
    이 작은 조수는 기본 ASP를 대체하기 위해 IServiceProviderIServiceCollection을 제공합니다.NET 커널 유형 및 Moq의 시뮬레이션을 사용합니다.
    IoC 컨테이너의 부팅 유형 등록이 완전한지 개인적으로 테스트합니다.

    나는 그것으로 무엇을 할 수 있습니까?
    부팅 시 IServiceCollectionIServiceProvider으로 사용할 수 있는 디렉터/메소드를 제공합니다.NET CORE의 의존성 주입
    매번 완전한 설정을 실행하지 않으려면, 자신의 시뮬레이션을 추가할 수도 있습니다.
    IServiceCollection으로 사용
    빈 MockProvider를 생성하여 기본 IServiceCollectionStartUp.ConfigureServices으로 사용합니다.
    IServiceProvider으로 사용
    전체 MockProvider를 생성하여 IServiceProvider에 필요한 모든 방법으로 사용합니다.

    당신의 시뮬레이션을 추가합니다
    특정 시뮬레이션을 추가하는 가장 간단한 방법은 CreateMock<T> 방법을 사용하는 것이다.
        var m = new MockProvider();
        m.CreateMock<IFoo>();
        Assert.IsNotNull(m.GetService<IFoo>());
    
    약간의 과부하가 있다.
  • public Mock<U> CreateMock<U>()이것은 가장 기본적인 판본이다.구조 함수 파라미터를 찾아서 시뮬레이션을 만들 것입니다.완성되면 시뮬레이션을 되돌려줍니다.
    이전에 등록된 형식을 사용하여 구조 함수 매개 변수를 매칭하고 아날로그를 직접 만들 수 있기 때문에 매개 변수 형식을 용기에 넣은 후에만 사용하거나 구조 함수에 매개 변수가 없는 형식에만 사용할 수 있습니다.
  • public Mock<U> CreateMock<U>(params object[] o)이것은 구조 함수 파라미터를 지정하고 만든 시뮬레이션을 되돌려줍니다.
  • public MockDescriptor CreateMock(Type serviceType)첫 번째와 마찬가지로 자체적으로 모든 일을 완성하지만 국제올림픽위원회가 등록한 내부 대표에게 돌려준다.처음 사용할 때, Mock은 불활성 생성입니다.
  • public MockDescriptor CreateMock(Type serviceType, params object[] o)두 번째와 마찬가지로, 이것은 구조 함수 파라미터를 지정할 수 있지만, IoC가 등록한 내부 표시를 되돌려줍니다.처음 사용할 때, Mock은 불활성 생성입니다.
  • public MockDescriptor CreateMock(Type serviceType, IEnumerable<object> o)두 번째와 마찬가지로, 이것은 구조 함수 파라미터를 지정할 수 있지만, IoC가 등록한 내부 표시를 되돌려줍니다.처음 사용할 때, Mock은 불활성 생성입니다.
  • 그리고:
  • public void Add(ServiceDescriptor item)IServiceCollections 내부 유형을 사용하는 세 가지 방법이 있습니다.
  • 기본값은 ServiceDescriptor입니다.NET Core의 IoC 컨테이너
    이렇게 하면 ServiceType이 사용되고 에뮬레이션이 등록됩니다.처음 사용할 때, Mock은 불활성 생성입니다.
  • MockDescriptor에서 ServiceDescriptor을 파생시켜 먼저 시뮬레이션을 만들고 IoC 용기에 추가할 수 있도록 합니다.MockDescriptor - 인스턴스를 컨테이너에 있는 그대로 추가합니다.
  • 에는 또 하나의 InstanceDescriptor이 있습니다. 이것은 용기에 실제 대상을 추가하여 자신의 캐시를 실현하고 IoC 용기에서 사용할 수 있도록 합니다.InstanceDescriptor-Instance는 MockDescriptor에서 파생된 원형으로 용기에 추가됩니다.

  • FAQ

    동일한 서비스 유형에 여러 번 등록하면 GetService<T>()에서 어떤 서비스 유형이 반환됩니까?
        var fooMock1 = new Mock<IFoo>();
        var fooMock2 = new Mock<IFoo>();
        var m = new MockProvider();
        m.Add<IFoo>(fooMock1);
        m.Add<IFoo>(fooMock2);
    
    첫 번째 참가자가 이겼다.따라서 이 내용은 fooMock1만 용기에 추가된다.

    좋은 웹페이지 즐겨찾기