코드를 내부적으로 작성하지만 다른 프로젝트의 단위 테스트에 사용할 수 있음

StackOverflow https://stackoverflow.com/questions/106907

  •  01-07-2019
  •  | 
  •  

문제

우리는 모든 단위 테스트를 자체 프로젝트에 넣었습니다.단위 테스트를 위해서만 내부 클래스가 아닌 특정 클래스를 공개로 만들어야 한다는 것을 알게 되었습니다.어쨌든 이 일을 하지 않아도 되는 방법이 있나요?클래스를 봉인된 대신 공개로 설정하면 메모리에 어떤 영향이 있나요?

도움이 되었습니까?

해결책

.NET을 사용하는 경우 내부 VisibleTo 어셈블리 속성을 사용하면 "친구" 어셈블리를 만들 수 있습니다.이는 다른 어셈블리의 내부 클래스 및 멤버에 액세스할 수 있는 강력한 이름의 특정 어셈블리입니다.

이는 관련 어셈블리를 긴밀하게 연결하므로 신중하게 사용해야 합니다.InternalsVisibleTo의 일반적인 용도는 단위 테스트 프로젝트입니다.위에서 설명한 이유로 인해 실제 애플리케이션 어셈블리에 사용하기에는 좋은 선택이 아닐 수 있습니다.

예:

[assembly: InternalsVisibleTo("NameAssemblyYouWantToPermitAccess")]
namespace NameOfYourNameSpace
{

다른 팁

내부 클래스인 경우 단독으로 사용해서는 안 됩니다.따라서 내부적으로 해당 개체를 사용하는 다른 클래스를 테스트하는 것 외에는 실제로 테스트해서는 안 됩니다.

클래스의 전용 멤버를 테스트해서는 안 되는 것처럼 DLL의 내부 클래스도 테스트해서는 안 됩니다.이러한 클래스는 공개적으로 액세스할 수 있는 일부 클래스의 구현 세부 사항이므로 다른 단위 테스트를 통해 잘 연습해야 합니다.

내부 구현 세부 사항을 테스트하면 테스트가 취약해지기 때문에 클래스의 동작만 테스트하려고 한다는 생각입니다.모든 테스트를 중단하지 않고도 모든 클래스의 구현 세부 사항을 변경할 수 있어야 합니다.

해당 클래스를 실제로 테스트해야 한다고 판단되면 먼저 해당 클래스가 내부 클래스인 이유를 재검토하고 싶을 수도 있습니다.

문서화 목적으로

또는 다음을 사용하여 내부 클래스를 인스턴스화할 수 있습니다. Type.GetType 방법

//IServiceWrapper is public class which is 
//the same assembly with the internal class 
var asm = typeof(IServiceWrapper).Assembly;
//Namespace.ServiceWrapper is internal
var type = asm.GetType("Namespace.ServiceWrapper");
return (IServiceWrapper<T>)Activator
    .CreateInstance(type, new object[1] { /*constructor parameter*/ });

일반 유형의 경우 다음과 같이 다른 프로세스가 있습니다.

var asm = typeof(IServiceWrapper).Assembly;
//note the name Namespace.ServiceWrapper`1
//this is for calling Namespace.ServiceWrapper<>
var type = asm.GetType("Namespace.ServiceWrapper`1");
var genType = type.MakeGenericType(new Type[1] { typeof(T) });
return (IServiceWrapper<T>)Activator
     .CreateInstance(genType, new object[1] { /*constructor parameter*/});

클래스는 공개 및 밀봉 둘 다 가능합니다.

하지만 그렇게 하지 마세요.

내부 클래스를 리플렉션하는 도구를 만들고 리플렉션을 통해 모든 것에 액세스하는 새 클래스를 내보낼 수 있습니다.MSTest가 그렇게 합니다.

편집하다:내 말은, 원래 어셈블리에 어떤 테스트 항목도 포함하고 싶지 않다면;이는 멤버가 비공개인 경우에도 작동합니다.

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