Core 어셈블리가 특정 클래스를 노출하지 않도록하고 싶지만 여전히 테스트 할 수 있기를 원합니다. 어떻게 할 수 있습니까?
답변:
InternalsVisibleTo 는 구조에 기여합니다!
다음을 추가하십시오.
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
Core 클래스 AssemblyInfo.cs 파일에
모범 사례는 Friend 어셈블리 (C # 프로그래밍 가이드) 를 참조하세요 .
어셈블리 이름이 강력한 경우 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
내 단위 테스트를 테스트중인 코드와 동일한 어셈블리에 넣었습니다. "스스로 테스트"를 "스스로 초기화"및 "스스로 설명"과 같은 클래스의 기능으로 생각하기 때문에 이것은 나에게 의미가 있습니다.
이 접근 방식에 대해 몇 가지 이의를 들었지만 설득력있는 사람은 거의 없습니다.
성능이 나빠요 Bah, I say! 하드 데이터없이 최적화하지 마십시오! 느린 링크를 통해 어셈블리를 다운로드 할 계획이라면 어셈블리 크기를 최소화하는 것이 좋습니다.
그것은 보안 위험 입니다. 테스트에 비밀이있는 경우에만. 그러지 마.
자, 당신의 상황은 저와 다르기 때문에 당신에게 이해가 될 수도 있고 그렇지 않을 수도 있습니다. 스스로 알아 내야합니다.
참고 : C #에서는 테스트중인 클래스 내부에 중첩 된 "Tests"라는 클래스에 단위 테스트를 배치하려고했습니다. 이것은 사물의 올바른 구성을 분명하게 만들었습니다. 또한 "Foo"클래스에 대한 테스트가 "FooTests"라는 클래스에있을 때 발생하는 이름 중복을 방지했습니다. 그러나 내가 액세스 할 수있는 단위 테스트 프레임 워크는 "공개"로 표시되지 않은 테스트를 거부했습니다. 이것은 테스트하는 클래스가 "비공개"가 될 수 없음을 의미합니다. 나는 테스트를 "공개"로해야하는 타당한 이유를 생각할 수 없다. 누구도 테스트를 공개 방법이라고 부르지 않기 때문이다. 모든 것이 반영을 통해 이루어진다. .Net 용 단위 테스트 프레임 워크를 작성한 적이 있다면 비공개 테스트 허용을 고려해주세요.
[Conditional("DEBUG")]
테스트 클래스에 그들은 조립 생산하지 및 성능을 다치게해서는 안된다.
그런 문제를 일으키지 않는 것이 좋습니다. "내부"클래스를 단위 테스트하려면 내부 코드 만 사용하게 될 네임 스페이스에 숨 깁니다. 당신은 .NET 프레임 워크의 규모에 프레임 워크를 작성하지 않는 한, 당신은하지 않습니다 정말 숨어의 수준이 필요합니다.