16

[] 물론, 문제는 특정 "친구"구현에만 국한되지 않고 관련성이있는 경우 구현 세부 사항을 지적 할 수 있습니다.단위 테스트를 위해 "친구"선언 사용하기. 나쁜 생각?

대답없는 질문을 읽고 InternalsVisibleTo 속성을 발견했습니다.

인 현재 어셈블리에서만 일반적으로 볼 수있는 유형이 다른 어셈블리에서 볼 수 있도록 지정합니다.

MSDNC# Programming Guide에는 internal 메서드 및 형식을 다른 어셈블리에 사용할 수 있도록 특성을 사용하는 방법을 설명하는 Friend Assemblies 구역이 있습니다.

유닛 테스트 어셈블리에서 사용하기 위해 라이브러리를 계측하기위한 "숨겨진"인터페이스를 만들기 위해이 방법을 사용하는 것이 좋은지 궁금합니다. 그것은 양방향 (생산 어셈블리의 테스트 코드, 테스트 코드의 생산 어셈블리에 대한 친밀한 내부 지식)에서 대규모로 결합을 증가시키는 것으로 보이지만, 반면에 공용 인터페이스를 어지럽히 지 않으면 서 세밀한 테스트를 만드는 데 도움이 될 수 있습니다.

테스트 할 때 친구 선언을 사용한 경험은 무엇입니까? 그것은 당신의 은탄 이었습니까, 아니면 죽음의 행진을 시작 했습니까?

답변

13

저는이 기술을 광범위하게 사용했습니다. 즉, 단위 테스트를 통해 일반 소비자가 볼 수없는 코드 라이브러리의 측면을 테스트 할 수 있다는 의미입니다.

[InternalsVisibleTo]을 사용하는 동안 커플 링이 증가하지만, (마이너) 증가가 이득이 될만한 가치가 있다고 생각합니다.

내 단위 테스트는 이미 테스트중인 코드와 밀접하게 결합되어 있습니다. 일반 소비자에게는 보이지 않는 것들에 액세스하여 특정 구현이 아닌 특정 결과를 보장하기 위해 테스트를 작성하려고 시도하지만 구현을 다소 제한합니다. 다른 방법으로가는

는 결합 최소화 -과 같은 몇 가지 마킹 코드 조립체에 [InternalsVisibleTo] 특성을 갖는 것을 내부 대신 (또는 내부 대신 보호 보호) 개인 의 .

은 (내가 여기 완전히 다른 토론입니다 단위 테스트의 사용에 의해 유발되는 모든 설계 변경을 무시하고있어합니다.)

[InternalsVisibleTo] 속성은 어셈블리의 이름을 지정 강력한 요구한다. 이 작업을 아직 수행하지 않았다면 강하게 명명 된 어셈블리는 다른 강하게 명명 된 어셈블리에만 의존하기 때문에 약간의 부담이 될 수 있습니다. 따라서 여러 어셈블리를 변경해야 할 수도 있습니다.

테스트 어셈블리의 공개 키를 포함해야하기 때문에 속성 권한을 얻는 것이 약간의 어려움이 될 수 있습니다. IDesign은 클립 보드에 붙여 넣을 준비가 된 속성을 만드는 유용한 Friend Assembly tool을 가지고 있습니다. 권장 사항.

+0

강력한 이름 지정에 대한 힌트를 제공해 주셔서 감사합니다! 나는 (아직) 이것을 인식하지 못했지만, 모든 어셈블리가 공개를 위해 강하게 명명되어야한다고 생각하기 때문에, 나는 이것을 실제 문제로 보지 않는다. –

12

저는 개인적으로 InternalsVisibleTo에 적용한 유일한 용도입니다. 실제로는 매우 유용했습니다.

단위 테스트를 블랙 박스 테스트로 보지 않습니다. 테스트는 이미 구현에 어느 정도 결합되어 있습니다. 내부 유형 및 메서드를 테스트 할 수 있으므로 훨씬 더 정밀한 포커스 (더 작은 단위)가 가능합니다.

3

단위 테스트를 사용하려면 InternalsVisibleToAttribute을 사용하는 것이 좋습니다. "단위 테스트"의 "단위"는 클래스이며 internal 클래스가 포함되어 있으므로 테스트 해 보겠습니다. 그래도 I don't want to unit test private methods.

테스트 용으로 특별한 개인 인터페이스를 만드는 것이 좋다고 생각하지 않습니다. 단위 테스트의 가치 중 하나는 클래스의 소비자 관점에서 클래스에 대한 인터페이스를 생각할 수있는 기회를 제공한다는 것입니다. 뒷문을 제공하면 그 혜택이 사라집니다.

하지만 내 단위 테스트는 제작 코드와 동일한 어셈블리에 넣는 것이 좋습니다. 일반적으로 내 고객에게 영향을주지는 않지만 나를 위해 단순화합니다. 그래서 해냅니다. 그렇게하면 InternalsVisibleTo 질문이 사라집니다.

3

사실, 단위 테스트는 에만 해당되며 InternalsVisibleToAttribute을 사용하도록 가져 왔습니다. 이를 통해 클래스 내부의 불변량을보다 침해 테스트 할 수 있도록 단위 테스팅 프레임 워크에 노출시키는 대신 '사적'메소드의 상당 부분을 내부로 구현할 수 있습니다.

나는이 기술로 큰 성공을 거뒀습니다. 다른 방법이 없다면 액세스 할 수없는 상황에서 개인 메서드를 호출하여 신화적인 100 % 코드 적용 목표에 접근하는 데 도움이됩니다.

2

레거시 C++ 코드와 최신 C# 코드를 함께 사용할 때 별도의 어셈블리를 사용하면 다른 합법적 인 사용 사례가 있다고 생각합니다.

우리는 C++ 어셈블리를 가져 와서 C++/CLI로 변환 한 다음 C#에서 새로운 코드를 구현했습니다. 이렇게 할 때 우리는 여전히 C#의 클래스/메소드에 대해 "내부"를 사용하지만 실제로는 공개되지 않습니다. 그런 다음이를 레거시 코드에서 친구 어셈블리로 사용할 수있게합니다.

관련 문제