문제

나는 의존성 주입을 배우려고 노력하고 있으며, 단위가 응용 프로그램을 테스트 할 때 문제가 발생했습니다.

콘솔 애플리케이션을 작성하고 컨테이너가 Main ()에서 생성 및 초기화되어 있습니다. get-property 안에 Program.Container, 그래서 내 응용 프로그램의 어느 곳에서나 전화 할 수 있습니다 Program.Container.Resolve<..>().

다음과 같은 ServiceValidator 클래스가 있습니다.

public class ServiceValidator
{
    private readonly IConfiguration _configuration;
    private readonly IService _service;

    public ServiceValidator(IConfiguration configuration, IService service)
    {
        _configuration = configuration;
        _service = service;
    }

내가 사용하는 다른 클래스에서

ServiceValidator serviceValidator = Program.Container.Resolve<ServiceValidator>();
serviceValidator.VerifyVersion();

그것은 전화입니다 Program.Container.Resolve 이는 설정되지 않았기 때문에 단위 테스트에 문제가 발생합니다.

컨테이너에서 Resolve를 호출하는 것이 나쁜 관행입니까? ServiceValidator 인스턴스를 만들 수 있습니다 Main() 그리고 물체를 전달하지만, 그것은 방금 다음 방법으로 전달되는 객체에 대한 많은 매개 변수를 유발할 것이기 때문에 어리석은 것처럼 보입니다.

따라서 클래스 내에서 Resolve를 호출하는 것이 허용되는 것 같지만 컨테이너는 단위 테스트를 위해 구성되어야합니다. 어떻게 해야하는지, 컨테이너를 프로그램 클래스 이외의 다른 장소로 옮겨야합니까? 어떤 것을 권 하시죠?

중요하다면 Unity와 C#을 사용하고 있습니다.

감사 :-)

도움이 되었습니까?

해결책

컨테이너에서 Resolve를 호출하는 것이 나쁜 관행입니까? main ()에서 servicevalidator 인스턴스를 만들고 객체를 전달할 수 있지만, 다음 방법으로 전달되는 객체에 대한 많은 매개 변수가 생길 수 있기 때문에 어리석은 것처럼 보입니다.

종속성 주입을 완전히 사용하면 많은 매개 변수를 객체에 전달할 필요가 없습니다. 각 객체의 생성자는 그 자체가 직접 사용하는 종속성 만 매개 변수 로야합니다. 직접 종속성의 전이 종속성에 대해서는 알지 못합니다.

따라서 ServiceValidator가 필요한 클래스 X가있는 경우 Class X에는 ServiceValidator 유형의 생성자 매개 변수가 있습니다. 그러면 일부 클래스 y가 클래스 X를 사용하는 경우 클래스 Y는 유형 X의 생성자 매개 변수를 갖습니다. 아무것도 모릅니다 ServiceValidator에 대해 ServiceValidator를 한 클래스에서 다른 클래스로 전달할 필요가 없습니다. 사용되는 유일한 장소는 X를 구성 할 때 또는 종종 DI 프레임 워크 또는 손으로 작성된 한 곳에서만 수행됩니다. 공장.

자세한 내용은 일부 링크 :

다른 팁

나는 여전히 메인과 같은 장소의 컨테이너에서 종속성을 해결하기 위해 전화를 허용하지만 여전히 최소한으로 유지하려고 노력합니다. 그런 다음 내가하는 일은 테스트 클래스의 초기화 방법에서 컨테이너를 구성하는 것입니다. 컨테이너를 호출 해야하는 테스트 클래스의 가짜 구현으로 초기화되었습니다.

컨테이너를 초기화 해야하는 것을 호출하지 않는 테스트 클래스는 그것을 무시하고 가짜를 사용하지 않을 수 있습니다. 나는 보통 그 경우 모의를 사용합니다.

나도 사용합니다 Microsoft 서비스 로케이터 내가 취하고있는 종속성은 특정 컨테이너 대신 .NET 프레임 워크의 무언가에 있습니다. 이것은 내가 홈 양조 컨테이너조차 원하는 것을 도로에서 내려갈 수있게한다.

정적 클래스를 컨테이너의 이니셜 라이저로 사용할 수 있습니다. bootstrapper.cs와 같은 것이 괜찮을 것입니다. 그런 다음 코드와 테스트에서 클래스 메소드를 참조 할 수 있습니다.

당신이 기술적으로하고있는 일은 수업의 서비스 위치입니다.

이 기사를 잠시 읽은 것을 기억합니다.

http://martinfowler.com/articles/injection.html

내 수업을 위해 나는 그들에게 Resolve를 사용하려고하지 않습니다. 필요할 때 컨테이너를 통해 물체를 만듭니다. 단위 테스트의 경우 모의 라이브러리와 스터브 클래스를 사용합니다.

문제는 주요 방법을 테스트하려고한다는 사실에 있습니다. 이 방법은 단위 테스트에는 사실상 불가능합니다.

나는 당신의 주요 방법을 테스트하지 않는 것이 가장 좋다고 주장합니다.

  • 현대 단위 테스트의 강조는 설계에 관한 것입니다
  • 단위 테스트에서 구성에 대한 종속성을 최소화해야합니다. 연기 또는 통합 테스트로 구성을 테스트 할 수 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top