문제

Bar 유형의 전용 멤버가 있는 Foo 클래스가 있다고 가정합니다.Foo의 구현에 Bar가 포함되어 있다는 사실을 사용자가 알기를 원하지 않으며 사용자가 자신의 Bar를 생성하여 Foo의 생성자, 다른 메소드 또는 구성 파일을 통해 전달하는 것을 원하지 않습니다.

편집하다:Bar는 특수 데이터베이스, 네트워크 연결 또는 기타 프로세스와 같이 테스트 환경의 제어 외부 리소스에 액세스한다는 점에서도 문제가 있습니다.

Foo를 단위 테스트할 수도 있으면 어떻게 합니까?의존성 주입이 여전히 가능합니까?이는 Bar와 Foo가 너무 긴밀하게 결합되어 있고(종속성이 일방향임에도 불구하고) 이러한 상황이 결코 허용될 수 없다는 것을 의미합니까?

도움이 되었습니까?

해결책

면책 조항 : 나는 일합니다 타입 콕]

세 가지 대안이 있습니다.

  1. Bar Class를 설정하는 내부 메소드를 작성 - AssemblyInf.cs 파일에서 InternalvisIbleto를 사용하여 테스트를 통해 해당 클래스를 설정할 수 있습니다.
  2. DI를 사용하여 바 클래스를 주입하십시오. 테스트 변경 중에 해당 클래스가 더미 또는 가짜로 클래스를 주입하십시오.
  3. TypeMock Islator (.NET)와 같은 가짜/조롱 프레임 워크를 사용하여 다른 클래스 내에서 생성 된 개체에서 가짜 동작을 설정할 수 있습니다. Isolate.Swap.NextInstance<Bar>.With(fakeBar);

다른 팁

당신은 당신이 그것을 도울 수 있다면 의존성을 숨기고 싶지 않습니다.

코드라면 재 설계하여 의존성을 명시 적으로 만들어야합니다. Bar 고가의 리소스에 직접 액세스하기보다는 고가의 리소스에서 생성 된 개체를 수락하려면 : 데이터베이스 액세스 코드 (또는 무엇이든)를 Bar 그리고 들어갑니다 Foo, 테스트 복식을 주입 할 수있는 곳.

그것이 실용적이지 않다면 (즉, 다른 사람의 수업을 다루고 있습니다), Dror의 목록 아주 좋습니다.

막대 유형이 FOO의 구현 세부 사항 일 뿐이라면, 단위 테스트는 어쨌든 FOO의 공개 인터페이스 만 운동해야하므로 막대 생성에 대해 걱정할 필요가 없습니다.

편집 : Bar가 외부 리소스에 액세스하면 FOO에 대한 명시 적 의존성을 만들고 인스턴스를 FOO의 생성자로 전달하여 단위 테스트를 위해 쉽게 조롱 할 수 있습니다.

귀하의 문제는 비공개 회원에 액세스해야 한다는 것이 아닙니다.그것은 문제의 클래스가 격리되도록 설계되지 않았습니다..이는 매우 구체적인 한 가지 용도만 허용합니다. new 값비싼 리소스로 이동하는 개체를 위로 올립니다.

테스트할 수 없는 설계를 해킹하는 데 성공하더라도 여전히 통합 테스트만 수행하게 됩니다.단위 테스트는 통합의 반대인 격리에 관한 것입니다.해당 클래스는 격리될 수 없으므로 정의에 따라 단위 테스트를 수행할 수 없습니다.

종속성을 외부화하는 것이 바람직하지 않은 이유가 있습니까?이 개체는 다른 개체와 마찬가지로 종속성 주입에서 제외됩니까?

편집하다:

나는 물론 당신이 알고 ~할 수 있다 어떤 속임수로 그것을 격리하십시오.그러나 이러한 기술은 공개 인터페이스를 우회하여 향후 유연성을 제한하고 누군가 이를 깨뜨릴 가능성을 높입니다(기본적으로 비공개 멤버의 유용성을 무효화함).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top