내부 클래스 라이브러리를 테스트하는 방법은 무엇입니까?
복잡한 개체를 생성하지만 가능한 한 적게 노출되어야하는 클래스 라이브러리를 작성하고 싶습니다. 나는 그것이 다른 프로젝트에 포함되기를 원하고 거기에는 내부적으로 생성 된 클래스의 객체를 반환하는이 라이브러리에 대한 호출이 하나뿐입니다. 다른 사람이 이러한 개체를 명시 적으로 만들 수 있도록 허용하고 싶지 않지만 여전히이 클래스 라이브러리에 대한 테스트 프로젝트를 만들고 싶습니다.
예를 들면 :
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.cs
obj 폴더 ( obj\Debug\netstandard2.0
)가 업데이트 되었는지 확인할 수 있습니다 InternalsVisibleTo
.
참조 URL : https://stackoverflow.com/questions/15440935/how-to-test-internal-class-library
'Nice programing' 카테고리의 다른 글
상대 경로를 절대 경로로 변환 하시겠습니까? (0) | 2021.01.05 |
---|---|
자바 스크립트 사전의 키는 값으로 저장되지 않고 변수 이름으로 저장됩니다. (0) | 2021.01.05 |
Apache Spark 대 Akka (0) | 2021.01.05 |
"pull to refresh"작업을 비활성화하고 표시기 만 사용하는 방법은 무엇입니까? (0) | 2021.01.05 |
VB.NET에서 배열을 인라인으로 선언하는 방법 (0) | 2021.01.05 |