나는 단위 테스트에 익숙하지 않아서 더 많은 ‘내부’액세스 수정자를 사용하기 시작하는지 알아 내려고 노력 중입니다. ‘internal’을 사용하고 어셈블리 변수 ‘InternalsVisibleTo’를 설정하면 테스트 프로젝트에서 public을 선언하고 싶지 않은 함수를 테스트 할 수 있습니다. 이것은 적어도 각 프로젝트 (해야합니까?)에는 자체 테스트 프로젝트가 있기 때문에 항상 ‘내부’를 사용해야한다고 생각합니다. 내가 왜 이것을하지 말아야하는지 이유를 말해 줄 수 있습니까? ‘비공개’는 언제 사용해야합니까?
답변
내부 클래스를 테스트해야하며 어셈블 속성이 있습니다.
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
이를 프로젝트 정보 파일에 추가하십시오 (예 🙂 Properties\AssemblyInfo.cs
.
답변
당신은 개인적인 방법을 테스트 할 경우, 한 번 봐 가지고 PrivateObject
와 PrivateType
에서 Microsoft.VisualStudio.TestTools.UnitTesting
네임 스페이스를. 필요한 리플렉션 코드 주위에 래퍼를 쉽게 사용할 수 있습니다.
문서 도구 :
PrivateType , PrivateObject
VS2017 및 2019의 경우 MSTest를 다운로드하여 찾을 수 있습니다.
답변
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
답변
기본적으로 비공개를 사용하십시오. 멤버가 해당 유형 이상으로 노출되지 않아야하는 경우 같은 유형의 프로젝트 내에서도 해당 유형 이상으로 노출되어서는 안됩니다. 이렇게하면 물건을보다 안전하고 깔끔하게 유지할 수 있습니다. 객체를 사용할 때 사용할 수있는 방법이 더 명확합니다.
그러나 자연스럽게 개인 메서드를 테스트 목적으로 내부적으로 만드는 것이 합리적이라고 생각합니다. 리팩토링에 익숙하지 않은 리플렉션을 사용하는 것이 좋습니다.
고려해야 할 한 가지는 “ForTest”접미사 일 수 있습니다.
internal void DoThisForTest(string name)
{
DoThis(name);
}
private void DoThis(string name)
{
// Real implementation
}
그런 다음 동일한 프로젝트 내에서 클래스를 사용할 때 실제로는이 방법을 사용하지 않아야한다는 것이 명백합니다 (현재와 미래). 테스트 목적으로 만 존재합니다. 이것은 약간 해키이며, 내가하는 일이 아니지만 적어도 고려할 가치가 있습니다.
답변
개인도 사용할 수 있으며 리플렉션을 사용하여 개인 메서드를 호출 할 수 있습니다. Visual Studio Team Suite를 사용하는 경우 개인 메서드를 호출하는 프록시를 생성하는 멋진 기능이 있습니다. 다음은 개인 및 보호 된 메소드를 단위 테스트하기 위해 직접 작업을 수행 할 수있는 방법을 보여주는 코드 프로젝트 기사입니다.
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
어떤 액세스 수정자를 사용해야하는지에 대한 일반적인 경험 규칙은 필요에 따라 비공개로 시작하고 이관합니다. 이렇게하면 클래스의 내부 세부 정보를 거의 필요로하지 않고 구현 세부 정보를 숨겨두는 데 도움이됩니다.
답변
나는 사용 Dotnet 3.1.101
하고 있으며 .csproj
나를 위해 일한 추가 사항은 다음과 같습니다.
<PropertyGroup>
<!-- Explicitly generate Assembly Info -->
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
</PropertyGroup>
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
<_Parameter1>MyProject.Tests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
이것이 누군가를 도울 수 있기를 바랍니다!