[C#] 단위 테스트를 수행 할 때 C # “내부”액세스 수정 자

나는 단위 테스트에 익숙하지 않아서 더 많은 ‘내부’액세스 수정자를 사용하기 시작하는지 알아 내려고 노력 중입니다. ‘internal’을 사용하고 어셈블리 변수 ‘InternalsVisibleTo’를 설정하면 테스트 프로젝트에서 public을 선언하고 싶지 않은 함수를 테스트 할 수 있습니다. 이것은 적어도 각 프로젝트 (해야합니까?)에는 자체 테스트 프로젝트가 있기 때문에 항상 ‘내부’를 사용해야한다고 생각합니다. 내가 왜 이것을하지 말아야하는지 이유를 말해 줄 수 있습니까? ‘비공개’는 언제 사용해야합니까?



답변

내부 클래스를 테스트해야하며 어셈블 속성이 있습니다.

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

이를 프로젝트 정보 파일에 추가하십시오 (예 🙂 Properties\AssemblyInfo.cs.


답변

당신은 개인적인 방법을 테스트 할 경우, 한 번 봐 가지고 PrivateObjectPrivateType에서 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>

이것이 누군가를 도울 수 있기를 바랍니다!


답변