6

나는 Simple Injector 의존성 주입 프레임 워크를 사용하고 있으며 멋지게 멋지게 보입니다. 그러나 구성을 작성하고 사용하고 나면 이제 한 구성에서 다른 구성으로 변경하는 방법을 알고 싶습니다.단순 주입기와 다른 구성 사용

시나리오 : 글로벌 Asax에서 구성을 설정했는데 공용 및 글로벌 Container 인스턴스가 있다고 가정 해 봅니다. 이제 몇 가지 테스트를 만들고 싶습니다. 모의 수업을 사용하여 구성을 변경하고 싶습니다.

다른 구성을 만들어서 기본적으로 글로벌 Container에 할당 할 수 있으므로 테스트를 실행할 때마다 대체 구성이 설정됩니다. 하지만 그 일을하면서 개발 컨텍스트에 있지만 일반 요청의 경우에도 모두 Container이 변경됩니다. 나는이 상황에서 테스트 중이라는 것을 알고 있지만 그것은 중요하지 않아야한다. 그러나 나는 이것이 이것을하기위한 방법이 아니라는 느낌을 가지고있다 ... 올바른 설정으로 한 설정에서 다른 설정으로 바꾸는 것이 궁금하다.

+0

자동 테스트를 설정 하시겠습니까?그렇다면 모든 테스트 케이스 전에 컨테이너를 재 구축하면됩니다 (필요한 경우 모의 객체 사용). 이것은 MSTest의'[TestInitialize]'와 NUnit의'[SetUp]'입니다. –

답변

6

단위 테스트를 수행 할 때 컨테이너를 전혀 사용하지 않아야합니다. 테스트 대상 클래스를 생성자로 호출하고 적절한 mock 객체를 제공하면됩니다.

과거에 많은 도움이 된 한 가지 패턴은 간단한 테스트 클래스 별 팩토리 메서드를 사용하는 것입니다. 이 방법은 테스트중인 클래스의 생성을 중앙 집중화하고 테스트중인 클래스의 종속성이 변경 될 때 변경해야하는 양을 최소화합니다. 이러한 팩토리 메서드는 다음과 같이 표시됩니다.

private ClassUnderTest CreateValidClassUnderTest(params object[] dependencies) 
{ 
    return new ClassUnderTest(
     dependencies.OfType<ILogger>().SingleOrDefault() ?? new FakeLogger(), 
     dependencies.OfType<IMailSender>().SingleOrDefault() ?? new FakeMailer(), 
     dependencies.OfType<IEventPublisher>().SingleOrDefault() ?? new FakePublisher()); 
} 

통합 테스트의 경우 컨테이너를 사용하고 컨테이너의 몇 가지 종속성을 교환하는 것이 훨씬 더 일반적입니다. 그러나 이러한 통합 테스트에서는 application_start에서 만든 컨테이너를 사용하지 않지만 각 통합 테스트에서는 각 컨테이너가 독립적으로 실행되어야하기 때문에 새 컨테이너 인스턴스가있을 가능성이 높습니다. application_start에서 단일 컨테이너를 사용한 경우에도 통합 테스트는 별도의 프로젝트에서 실행되므로 실행중인 응용 프로그램을 방해하지 않습니다.

각 통합 테스트에는 고유 한 컨테이너 인스턴스 (있는 경우)가 있어야하지만 가능한 한 많은 컨테이너 구성 코드를 계속 재사용하려고합니다. 이 코드를 호출 할 때 새로운 구성된 컨테이너 인스턴스를 반환하거나 제공된 컨테이너 인스턴스를 구성하고 아무 것도 반환하지 않는 메서드로이 코드를 추출하면됩니다. 이 메서드는 일반적으로 불완전한 구성을 수행해야하며 호출자 (테스트 또는 전역 asax)가 누락 된 구성을 추가해야합니다.

이 코드를 추출하면 동일한 구성을 부분적으로 공유하는 여러 최종 응용 프로그램을 사용할 수 있습니다. 통합 테스트에서 컨테이너를 확인할 수 있습니다. 통합 테스트를 통해 조롱 받아야 할 서비스를 추가 할 수 있습니다.

Simple Injector를 사용하면 기존 등록을 새 것으로 교체 할 수 있습니다 (예 : 조롱 된 항목). 다음과 같이 활성화 할 수 있습니다.

container.Options.AllowOverridingRegistrstions = true; 

하지만주의해야합니다. 이 옵션은 실수로 등록을 무시하는 사실을 숨길 수 있습니다. 내 경험상 대부분의 경우 불완전한 컨테이너를 구축하고 누락 된 등록을 무시한 다음 나중에 추가하는 것이 좋습니다. 또는 재정의하기로 결정한 경우 실수로 잘못된 구성이 발생하지 않도록 마지막 순간에 해당 기능을 활성화하십시오.

+0

감사합니다. 내가 상상했던 것 같다. –