어셈블리 (단위 테스트)가 다른 어셈블리의 내부 속성에 액세스하도록 허용하려면 어떻게합니까?


80

Core 어셈블리가 특정 클래스를 노출하지 않도록하고 싶지만 여전히 테스트 할 수 있기를 원합니다. 어떻게 할 수 있습니까?

답변:


107

InternalsVisibleTo 는 구조에 기여합니다!

다음을 추가하십시오.

[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]

Core 클래스 AssemblyInfo.cs 파일에

모범 사례는 Friend 어셈블리 (C # 프로그래밍 가이드) 를 참조하세요 .


3
aku가 연결하는 지침에 따라 강력한 명명 된 어셈블리를 사용하여이 작업을 성공적으로 수행했습니다. 그래도 한 가지 문제가 있습니다. 모든 것을 구성한 후 Intellisense가 작동하려면 Visual Studio를 다시 시작해야했습니다. 다시 시작하기 전에 컴파일되지만 항상 빨간색 선이 표시됩니다.
Eric Schoonover

20

어셈블리 이름이 강력한 경우 InternalsVisible을 사용하여 공개 키를 지정해야합니다 (참고 : 공개 키 토큰이 아닌 전체 키 ).

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests, 
  PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]

다음 트릭은 cmd 행에 의존하지 않고 공개 키를 얻는 데 정말 유용합니다.

http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx


9

내 단위 테스트를 테스트중인 코드와 동일한 어셈블리에 넣었습니다. "스스로 테스트"를 "스스로 초기화"및 "스스로 설명"과 같은 클래스의 기능으로 생각하기 때문에 이것은 나에게 의미가 있습니다.

이 접근 방식에 대해 몇 가지 이의를 들었지만 설득력있는 사람은 거의 없습니다.

성능이 나빠요 Bah, I say! 하드 데이터없이 최적화하지 마십시오! 느린 링크를 통해 어셈블리를 다운로드 할 계획이라면 어셈블리 크기를 최소화하는 것이 좋습니다.

그것은 보안 위험 입니다. 테스트에 비밀이있는 경우에만. 그러지 마.

자, 당신의 상황은 저와 다르기 때문에 당신에게 이해가 될 수도 있고 그렇지 않을 수도 있습니다. 스스로 알아 내야합니다.

참고 : C #에서는 테스트중인 클래스 내부에 중첩 된 "Tests"라는 클래스에 단위 테스트를 배치하려고했습니다. 이것은 사물의 올바른 구성을 분명하게 만들었습니다. 또한 "Foo"클래스에 대한 테스트가 "FooTests"라는 클래스에있을 때 발생하는 이름 중복을 방지했습니다. 그러나 내가 액세스 할 수있는 단위 테스트 프레임 워크는 "공개"로 표시되지 않은 테스트를 거부했습니다. 이것은 테스트하는 클래스가 "비공개"가 될 수 없음을 의미합니다. 나는 테스트를 "공개"로해야하는 타당한 이유를 생각할 수 없다. 누구도 테스트를 공개 방법이라고 부르지 않기 때문이다. 모든 것이 반영을 통해 이루어진다. .Net 용 단위 테스트 프레임 워크를 작성한 적이 있다면 비공개 테스트 허용을 고려해주세요.


5
흥미로운 접근 방식. 그리고 나는 테스트가 공개되는 것에 전적으로 동의합니다. 멍청한 요구 사항, IMO.
Kilhoffer 2011

@Kilhoffer : 나는 몇 년 동안 그것에 대해 불평을 해왔고, 당신은 나에게 정말로 동의하는 첫 번째 사람입니다. 감사!
Jay Bazuzi 2011

6
당신이 사용하는 경우 [Conditional("DEBUG")]테스트 클래스에 그들은 조립 생산하지 및 성능을 다치게해서는 안된다.
xmedeko

3

그런 문제를 일으키지 않는 것이 좋습니다. "내부"클래스를 단위 테스트하려면 내부 코드 만 사용하게 될 네임 스페이스에 숨 깁니다. 당신은 .NET 프레임 워크의 규모에 프레임 워크를 작성하지 않는 한, 당신은하지 않습니다 정말 숨어의 수준이 필요합니다.


하단에서 귀하의 의견을 발견했을 때 귀하가 한 말을 정확히 언급하려고했습니다. +1! :)
Bjorn Reppen

2

리플렉션을 사용하거나 (MS 테스트 항목처럼) 단위 테스트 어셈블리를 코어 어셈블리의 친구로 선언 할 수 있습니다.

다른 옵션은 단위 테스트를 동일한 어셈블리에 배치하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.