IT

내부적으로 코드를 작성하지만 다른 프로젝트에서 단위 테스트에 사용 가능

lottoking 2020. 7. 16. 07:57
반응형

내부적으로 코드를 작성하지만 다른 프로젝트에서 단위 테스트에 사용 가능


우리는 모든 단위 테스트를 자체 프로젝트에 넣었습니다. 우리는 단위 테스트를 내부 대신 특정 클래스를 공개해야한다고 알았습니다. 어쨌든 중복 된 서열 피할 수 있습니까? 봉인 대신에 클래스를 공개적으로 사용 가능 메모리에 영향은 무엇입니까?


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

이것은 신중하게 어셈블리를 사용합니다. 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는 그렇게합니다.

편집 : 원래 어셈블리에 테스트 항목을 포함하지 않는 경우; 멤버가 비공개 인 경우에도 작동합니다.

참고 URL : https://stackoverflow.com/questions/106907/making-code-internal-but-available-for-unit-testing-from-other-projects

반응형