Nice programing

내부 클래스 라이브러리를 테스트하는 방법은 무엇입니까?

nicepro 2021. 1. 5. 21:12
반응형

내부 클래스 라이브러리를 테스트하는 방법은 무엇입니까?


복잡한 개체를 생성하지만 가능한 한 적게 노출되어야하는 클래스 라이브러리를 작성하고 싶습니다. 나는 그것이 다른 프로젝트에 포함되기를 원하고 거기에는 내부적으로 생성 된 클래스의 객체를 반환하는이 라이브러리에 대한 호출이 하나뿐입니다. 다른 사람이 이러한 개체를 명시 적으로 만들 수 있도록 허용하고 싶지 않지만 여전히이 클래스 라이브러리에 대한 테스트 프로젝트를 만들고 싶습니다.

예를 들면 :

var result = Manager.Instance.Create(definition)

이것은 클래스 라이브러리에 대한 유일한 액세스 여야합니다.

정의 매개 변수에 따라 다른 하위 클래스를 사용하여 요청 된 인스턴스를 만들고 그에 따라 속성을 설정합니다. 따라서 전체 생성 프로세스가 제대로 작동했는지 테스트를 통해 어떻게 든 확인하고 싶습니다. 그러나 결과 개체의 내부 속성도 거의 노출하고 싶지 않기 때문에 어설 션 할 속성이 없기 때문에이 공용 액세스 방법 만 사용하여 테스트 할 수 없습니다.

내부 메커니즘을 테스트해서는 안된다는 것을 알고 있으며 일반적으로 잘못된 디자인이며이 기사를 읽었습니다 .하지만 라이브러리와 단위 테스트 프로젝트를 만들 수있는 방법이 없을 수도 있고 나중에이 클래스에 대한 액세스를 제한 할 수도 있습니다. ? 래퍼 같은 거요?


.NET에서는 클래스 라이브러리 InternalsVisibleToAttribute 를 사용하여 내부 형식을 단위 테스트 프로젝트에 표시 할 수 있습니다.

이렇게하면 클래스를 내부로 유지하고 액세스 권한을 부여한 다른 어셈블리에서 계속 사용할 수 있습니다.

다음과 같이 사용합니다.

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]

최신 csproj 2017 형식 프로젝트의 경우 프로젝트에 AssemblyInfo.cs파일 이없는 경우 다음을 추가 할 수 있습니다.

  <ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>

다른 변수를 사용하여 직접 unittest 프로젝트 이름 MSBuildProjectName과 같이 relplace AssemblyName하거나 사용할 수도 있습니다.

를 추가하여 ProjectName.AssemblyInfo.csobj 폴더 ( obj\Debug\netstandard2.0)가 업데이트 되었는지 확인할 수 있습니다 InternalsVisibleTo.

참조 URL : https://stackoverflow.com/questions/15440935/how-to-test-internal-class-library

반응형