단위 테스트를 수행 할 때 C # "내부"액세스 수정 자
단위 테스트에 익숙하지 않아서 더 많은 '내부'액세스 수정자를 사용해야하는지 알아 내려고 노력 중입니다. 'internal'을 사용하고 어셈블리 변수 'InternalsVisibleTo'를 설정하면 테스트 프로젝트에서 public을 선언하고 싶지 않은 함수를 테스트 할 수 있습니다. 이것은 적어도 각 프로젝트 (자식해야합니까?)에 자체 테스트 프로젝트가 있기 때문에 항상 '내부'를 사용해야한다고 생각합니다. 내가 왜 이것을하지 말아야하는지 이유를 말해 줄 수 있습니까? '비공개'는 언제 사용해야합니까?
내부 클래스를 테스트해야하며 어셈블 속성이 있습니다.
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
이를 프로젝트 정보 파일에 추가하십시오 (예 :) Properties\AssemblyInfo.cs
.
당신은 개인적인 방법을 테스트 할 경우, 한 번 봐 가지고 PrivateObject
와 PrivateType
에서 Microsoft.VisualStudio.TestTools.UnitTesting
네임 스페이스를. 필요한 리플렉션 코드 주위에 래퍼를 사용하기 쉽습니다.
문서 도구 : PrivateType , PrivateObject
VS2017 및 2019의 경우 MSTest.TestFramework nuget을 다운로드하여 찾을 수 있습니다.
Eric의 답변에 추가하여 csproj
파일 에서이를 구성 할 수도 있습니다 .
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>MyTests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
또는 테스트 할 프로젝트 당 하나의 테스트 프로젝트가있는 경우 Directory.Build.props
파일 에서 다음과 같은 작업을 수행 할 수 있습니다.
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>$(MSBuildProjectName).Test</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
참조 : https://stackoverflow.com/a/49978185/1678053
예 : https://github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12
개인도 사용할 수 있으며 리플렉션을 사용하여 개인 메서드를 호출 할 수 있습니다. Visual Studio Team Suite를 사용하는 경우 개인 메서드를 호출하는 프록시를 생성하는 멋진 기능이 있습니다. 다음은 개인 및 보호 된 메소드를 단위 테스트하기 위해 직접 작업을 수행하는 방법을 보여주는 코드 프로젝트 기사입니다.
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
어떤 액세스 수정자를 사용해야하는지에 대한 일반적인 경험 규칙은 필요에 따라 비공개로 시작하고 이관합니다. 이렇게하면 클래스의 내부 세부 정보를 거의 필요로하지 않고 구현 세부 정보를 숨겨두는 데 도움이됩니다.
기본적으로 비공개를 사용하십시오. 멤버가 해당 유형 이상으로 노출되지 않아야하는 경우 동일한 유형의 프로젝트 내에서도 해당 유형 이상으로 노출되어서는 안됩니다. 이렇게하면 사물을보다 안전하고 깔끔하게 유지할 수 있습니다. 객체를 사용할 때 사용할 수있는 방법이 더 명확합니다.
그러나 자연스럽게 개인 메서드를 테스트 목적으로 내부적으로 만드는 것이 합리적이라고 생각합니다. 리팩토링에 익숙하지 않은 리플렉션을 사용하는 것이 좋습니다.
고려해야 할 한 가지는 "ForTest"접미사 일 수 있습니다.
internal void DoThisForTest(string name)
{
DoThis(name);
}
private void DoThis(string name)
{
// Real implementation
}
그런 다음 동일한 프로젝트 내에서 클래스를 사용할 때 실제로는이 방법을 사용하지 않아야한다는 것이 명백합니다 (현재와 미래). 테스트 목적으로 만 사용됩니다. 이것은 약간 해키이며, 내가하는 일이 아니지만 적어도 고려할 가치가 있습니다.
참고 URL : https://stackoverflow.com/questions/358196/c-sharp-internal-access-modifier-when-doing-unit-testing
'development' 카테고리의 다른 글
C # 자체 클래스 이름 얻기 (0) | 2020.02.21 |
---|---|
PostgreSQL 데이터베이스로 SQL 덤프 가져 오기 (0) | 2020.02.21 |
키 / 값 쌍 파일에서 환경 변수 설정 (0) | 2020.02.21 |
"git reset"과 "git checkout"의 차이점은 무엇입니까? (0) | 2020.02.21 |
getApplication () 대 getApplicationContext () (0) | 2020.02.21 |