단위 테스트를 수행 할 때 컨테이너를 전혀 사용하지 않아야합니다. 테스트 대상 클래스를 생성자로 호출하고 적절한 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;
하지만주의해야합니다. 이 옵션은 실수로 등록을 무시하는 사실을 숨길 수 있습니다. 내 경험상 대부분의 경우 불완전한 컨테이너를 구축하고 누락 된 등록을 무시한 다음 나중에 추가하는 것이 좋습니다. 또는 재정의하기로 결정한 경우 실수로 잘못된 구성이 발생하지 않도록 마지막 순간에 해당 기능을 활성화하십시오.
자동 테스트를 설정 하시겠습니까?그렇다면 모든 테스트 케이스 전에 컨테이너를 재 구축하면됩니다 (필요한 경우 모의 객체 사용). 이것은 MSTest의'[TestInitialize]'와 NUnit의'[SetUp]'입니다. –